def default( num_qubits: Optional[int] = None, *, qid_shape: Optional[Tuple[int, ...]] = None) -> 'ApplyUnitaryArgs': """A default instance starting in state |0⟩. Specify exactly one argument. Args: num_qubits: The number of qubits to make space for in the state. qid_shape: The shape of the state, specifying the dimension of each qid. Raises: TypeError: If exactly neither `num_qubits` or `qid_shape` is provided or both are provided. """ if (num_qubits is None) == (qid_shape is None): raise TypeError('Specify exactly one of num_qubits or qid_shape.') if num_qubits is not None: qid_shape = (2, ) * num_qubits qid_shape = cast(Tuple[int, ...], qid_shape) # Satisfy mypy num_qubits = len(qid_shape) state = qis.one_hot(index=(0, ) * num_qubits, shape=qid_shape, dtype=np.complex128) return ApplyUnitaryArgs(state, np.empty_like(state), range(num_qubits))
def _strat_has_unitary_from_apply_unitary(val: Any) -> Optional[bool]: """Attempts to infer a value's unitary-ness via its _apply_unitary_ method.""" method = getattr(val, '_apply_unitary_', None) if method is None: return None val_qid_shape = qid_shape_protocol.qid_shape(val, None) if val_qid_shape is None: return None state = qis.one_hot(shape=val_qid_shape, dtype=np.complex64) buffer = np.empty_like(state) result = method(ApplyUnitaryArgs(state, buffer, range(len(val_qid_shape)))) if result is NotImplemented: return None return result is not None