Implementation of `__array_ufunc__` for `DataSubjectArray` only supports `__call__`
According to https://numpy.org/doc/stable/reference/arrays.classes.html#numpy.class.__array_ufunc__, implementation of `__array_ufunc__` should support different call `method`s: `__call__`, `reduce`, `reduceat`, `accumulate`, `outer`, `inner`. In our current implementation for `DataSubjectArray` we only support `__call__`. In other words, if users call `np.multiply.reduce` on `DataSubjectArray(["bob", "alice"])` it would be the same as calling `np.multiply`.

https://github.com/OpenMined/PySyft/blob/291e506bec5de63e8fd96153efca9f1e31cc0e50/packages/syft/src/syft/core/adp/data_subject_list.py#L633-L641

See how we don't use the `method` argument passed to `__array_ufunc__` here?

Even though I suspect supporting `reduce`, `reduceat`, `accumulate`, `outer`, `inner` doesn't make sense for `DataSubjectArray`, we should at least throw an error when users try to do that.

This happens with our implementation of `__array_ufunc__` for `PassthroughTensor` too. In `PassthroughTensor`, supporting the other `method`s does make sense. That's why in #7111 I opted to just disable `__array_ufunc__` entirely for now.

@rasswanth-s
diff --git a/packages/syft/src/syft/core/adp/data_subject_list.py b/packages/syft/src/syft/core/adp/data_subject_list.py
index e2b8d0324..d1a36a463 100644
--- a/packages/syft/src/syft/core/adp/data_subject_list.py
+++ b/packages/syft/src/syft/core/adp/data_subject_list.py
@@ -630,16 +630,6 @@ class DataSubjectArray:
     def rint(self, *args: Any, **kwargs: Any) -> DataSubjectArray:
         return DataSubjectArray(self.data_subjects)
 
-    def __array_ufunc__(self, ufunc, method, *inputs, **kwargs) -> ArrayLike:  # type: ignore
-        method_name = ufunc.__name__
-        method = getattr(self, method_name, None)
-        if method is not None:
-            return method(*inputs, **kwargs)
-        else:
-            raise NotImplementedError(
-                f"Method: {method_name} not implemented in DataSubjectArray"
-            )
-
     @staticmethod
     def from_objs(input_subjects: Union[np.ndarray, list]) -> ArrayLike:
         # TODO: When the user passes the data subjects they might pass it as list
['packages/syft/src/syft/core/adp/data_subject_list.py']