diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/syft/__init__.py b/syft/__init__.py
index 67a265d83b..432a653b3d 100644
--- a/syft/__init__.py
+++ b/syft/__init__.py
@@ -1,1 +1,2 @@
-from .tensor import TensorBase
+from .tensor import *
+from .math import *
diff --git a/syft/math.py b/syft/math.py
new file mode 100644
index 0000000000..a7070e282a
--- /dev/null
+++ b/syft/math.py
@@ -0,0 +1,47 @@
+import numpy as np
+
+from syft import TensorBase
+from .tensor import _ensure_tensorbase
+
+__all__ = [
+    'dot', 'matmul',
+]
+
+
+def dot(tensor1, tensor2):
+    """Returns inner product of two tensors.
+
+    N-dimensional tensors are flattened into 1-D vectors, therefore this method should only be used on vectors.
+    """
+
+    tensor1 = _ensure_tensorbase(tensor1)
+    tensor2 = _ensure_tensorbase(tensor2)
+
+    if tensor1.encrypted is True or tensor2.encrypted is True:
+        return NotImplemented
+    return np.vdot(tensor1.data, tensor2.data)
+
+
+def matmul(tensor1, tensor2):
+    """Performs matrix multiplication between two tensors.
+
+    Exact behavior depends on the input tensors' dimensionality like so:
+    * If both tensors are 1-dimensional, their dot product is returned.
+    * If both tensors are 2-dimensional, their matrix-matrix product is returned.
+    * If either tensor has dimensionality > 2, the last 2 dimensions are treated as matrices and multiplied.
+    * If tensor1 is 1-dimensional, it is converted to a matrix by prepending a 1 to its dimensions.
+      This prepended dimension is removed after the matrix multiplication.
+    * If tensor2 is 1-dimensional, it is converted to a matrix by prepending a 1 to its dimensions.
+      This prepended dimension is removed after the matrix multiplication.
+    """
+
+    tensor1 = _ensure_tensorbase(tensor1)
+    tensor2 = _ensure_tensorbase(tensor2)
+
+    if tensor1.encrypted is True or tensor2.encrypted is True:
+        return NotImplemented
+
+    if tensor1.dim() == 1 and tensor2.dim() == 1:
+        return dot(tensor1, tensor2)
+    else:
+        return TensorBase(np.matmul(tensor1.data, tensor2.data))
diff --git a/syft/tensor.py b/syft/tensor.py
index 7d549da9bb..d7fb627572 100644
--- a/syft/tensor.py
+++ b/syft/tensor.py
@@ -1,4 +1,10 @@
 import numpy as np
+import syft
+
+__all__ = [
+    'equal', 'TensorBase',
+]
+
 
 def _ensure_ndarray(arr):
     if not isinstance(arr, np.ndarray):
@@ -6,83 +12,131 @@ def _ensure_ndarray(arr):
 
     return arr
 
+
+def _ensure_tensorbase(tensor):
+    if not isinstance(tensor, TensorBase):
+        tensor = TensorBase(tensor)
+
+    return tensor
+
+
+def equal(tensor1, tensor2):
+    """Checks if two tensors are equal.
+
+    Two tensors are considered equal if they are the same size and contain the same elements.
+
+    Assumption:
+    tensor1 and tensor2 are of type TensorBase.
+    Non-TensorBase objects will be converted to TensorBase objects.
+    """
+
+    tensor1 = _ensure_tensorbase(tensor1)
+    tensor2 = _ensure_tensorbase(tensor2)
+
+    if tensor1.encrypted is True or tensor2.encrypted is True:
+        return NotImplemented
+
+    return tensor1.data.shape == tensor2.data.shape and np.allclose(tensor1.data, tensor2.data)
+
+
 class TensorBase(object):
     """
-    A base tensor class that perform basic element-wise operation such as
-    addition, subtraction, multiplication and division
+    A base tensor class that performs basic element-wise operation such as
+    addition, subtraction, multiplication and division, and also dot and matrix products.
     """
 
     def __init__(self, arr_like, encrypted=False):
         self.data = _ensure_ndarray(arr_like)
         self.encrypted = encrypted
 
-    def __add__(self, arr_like):
-        """Performs element-wise addition between two array like objects"""
+    def __add__(self, tensor):
+        """Performs element-wise addition between two tensors"""
+        if self.encrypted:
+            return NotImplemented
+
+        tensor = _ensure_tensorbase(tensor)
+        return TensorBase(self.data + tensor.data)
+
+    def __iadd__(self, tensor):
+        """Performs in place element-wise addition between two tensors"""
+        if self.encrypted:
+            return NotImplemented
+
+        tensor = _ensure_tensorbase(tensor)
+        self.data = self.data + tensor.data
+        return self
+
+    def __sub__(self, tensor):
+        """Performs element-wise subtraction between two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        return self.data + arr_like
+        tensor = _ensure_tensorbase(tensor)
+        return TensorBase(self.data - tensor.data)
 
-    def __iadd__(self, arr_like):
-        """Performs in place element-wise addition between two array like objects"""
+    def __isub__(self, tensor):
+        """Performs in place element-wise subtraction between two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        self.data = self.data + arr_like
-        return self.data
+        tensor = _ensure_tensorbase(tensor)
+        self.data = self.data - tensor.data
+        return self
 
-    def __sub__(self, arr_like):
-        """Performs element-wise subtraction between two array like objects"""
+    def __eq__(self, tensor):
+        """Checks if two tensors are equal"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        return self.data - arr_like
+        return syft.equal(self, tensor)
 
-    def __isub__(self, arr_like):
-        """Performs in place element-wise subtraction between two array like objects"""
+    def dot(self, tensor):
+        """Returns inner product of two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        self.data = self.data - arr_like
-        return self.data
+        return syft.dot(self, tensor)
 
-    def __mul__(self, arr_like):
-        """Performs element-wise multiplication between two array like objects"""
+    def __matmul__(self, tensor):
+        """Performs matrix multiplication between two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        return self.data * arr_like
+        return syft.matmul(self, tensor)
 
-    def __imul__(self, arr_like):
-        """Performs in place element-wise multiplication between two array like objects"""
+    def __mul__(self, tensor):
+        """Performs element-wise multiplication between two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        self.data = self.data * arr_like
-        return self.data
+        tensor = _ensure_tensorbase(tensor)
+        return TensorBase(self.data * tensor.data)
 
-    def __truediv__(self, arr_like):
-        """Performs element-wise division between two array like objects"""
+    def __imul__(self, tensor):
+        """Performs in place element-wise multiplication between two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        return self.data / arr_like
+        tensor = _ensure_tensorbase(tensor)
+        self.data = self.data * tensor.data
+        return self
 
-    def __itruediv__(self, arr_like):
-        """Performs in place element-wise subtraction between two array like objects"""
+    def __truediv__(self, tensor):
+        """Performs element-wise division between two tensors"""
         if self.encrypted:
             return NotImplemented
 
-        arr_like = _ensure_ndarray(arr_like)
-        self.data = self.data / arr_like
-        return self.data
+        tensor = _ensure_tensorbase(tensor)
+        return TensorBase(self.data / tensor.data)
+
+    def __itruediv__(self, tensor):
+        """Performs in place element-wise subtraction between two tensors"""
+        if self.encrypted:
+            return NotImplemented
+
+        tensor = _ensure_tensorbase(tensor)
+        self.data = self.data / tensor.data
+        return self
 
     def shape(self):
         """Returns a tuple of input array dimensions."""
@@ -91,6 +145,13 @@ class TensorBase(object):
 
         return self.data.shape
 
+    def dim(self):
+        """Returns an integer of the number of dimensions of this tensor."""
+        if self.encrypted:
+            return NotImplemented
+
+        return self.data.ndim
+
     def sum(self, dim=None):
         """Returns the sum of all elements in the input array."""
         if self.encrypted:

Implement Default dim Functionality for Base Tensor Type
**User Story A:** As a Data Scientist using Syft's Base Tensor type, we want to implement a default method for computing operations on a Tensor of arbitrary type. For this ticket to be complete, diag() should return a list of the dimensions of the tensor. For a reference on the operation this performs check out [PyTorch](http://pytorch.org/docs/master/tensors.html)'s documentation.

**Acceptance Criteria:**
- If the Base Tensor type's attribute "encrypted" is set to True, it should return a NotImplemented error.
- a unit test demonstrating the correct operation on the Base Tensor type implemented over int and float Tensors.
- inline documentation in the python code. For inspiration on inline documentation, please check out [PyTorch](http://pytorch.org/docs/master/tensors.html)'s documentation for this operator.
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/test_math.py b/tests/test_math.py
new file mode 100644
index 0000000000..32ff2cff5f
--- /dev/null
+++ b/tests/test_math.py
@@ -0,0 +1,62 @@
+import unittest
+
+import numpy as np
+
+import syft
+from syft import TensorBase
+
+
+class DotTests(unittest.TestCase):
+    def testDotInt(self):
+        t1 = TensorBase(np.array([1, 2, 3]))
+        t2 = TensorBase(np.array([4, 5, 6]))
+        self.assertEqual(syft.dot(t1, t2), 32)
+
+    def testDotFloat(self):
+        t1 = TensorBase(np.array([1.3, 2.5, 3.7]))
+        t2 = TensorBase(np.array([4.9, 5.8, 6.5]))
+        self.assertEqual(syft.dot(t1, t2), 44.92)
+
+
+class MatmulTests(unittest.TestCase):
+    def testMatmul1DInt(self):
+        t1 = TensorBase(np.array([1, 2, 3]))
+        t2 = TensorBase(np.array([4, 5, 6]))
+        self.assertEqual(syft.matmul(t1, t2), syft.dot(t1, t2))
+
+    def testMatmul1DFloat(self):
+        t1 = TensorBase(np.array([1.3, 2.5, 3.7]))
+        t2 = TensorBase(np.array([4.9, 5.8, 6.5]))
+        self.assertEqual(syft.matmul(t1, t2), syft.dot(t1, t2))
+
+    def testMatmul2DIdentity(self):
+        t1 = TensorBase(np.array([[1, 0],
+                                  [0, 1]]))
+        t2 = TensorBase(np.array([[5.8, 6.5],
+                                  [7.8, 8.9]]))
+        self.assertTrue(syft.equal(syft.matmul(t1, t2), [[5.8, 6.5],
+                                                         [7.8, 8.9]]))
+
+    def testMatmul2DInt(self):
+        t1 = TensorBase(np.array([[1, 2],
+                                  [3, 4]]))
+        t2 = TensorBase(np.array([[5, 6],
+                                  [7, 8]]))
+        self.assertTrue(syft.equal(syft.matmul(t1, t2), [[19, 22],
+                                                         [43, 50]]))
+
+    def testMatmul2DFloat(self):
+        t1 = TensorBase(np.array([[1.3, 2.5],
+                                  [3.4, 4.5]]))
+        t2 = TensorBase(np.array([[5.8, 6.5],
+                                  [7.8, 8.9]]))
+        self.assertTrue(syft.equal(syft.matmul(t1, t2), [[27.04, 30.7],
+                                                         [54.82, 62.15]]))
+
+
+def main():
+    unittest.main()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/tests/test_tensor.py b/tests/test_tensor.py
index 8222b8250d..cba262e243 100644
--- a/tests/test_tensor.py
+++ b/tests/test_tensor.py
@@ -1,80 +1,117 @@
 from syft import TensorBase
+import syft
 import unittest
 import numpy as np
 
+
 # Here's our "unit tests".
+class DimTests(unittest.TestCase):
+    def testDimOne(self):
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(t.dim() == 1)
+
+
 class AddTests(unittest.TestCase):
     def testSimple(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t + np.array([1,2,3]), [2,4,6]))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t + np.array([1, 2, 3]), [2, 4, 6]))
 
     def testInplace(self):
-        t = TensorBase(np.array([1,2,3]))
-        t += np.array([1,2,3])
-        self.assertTrue(np.array_equal(t.data, [2,4,6]))
+        t = TensorBase(np.array([1, 2, 3]))
+        t += np.array([1, 2, 3])
+        self.assertTrue(syft.equal(t.data, [2, 4, 6]))
 
     def testScalar(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t + 2, [3, 4, 5]))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t + 2, [3, 4, 5]))
+
 
 class SubTests(unittest.TestCase):
     def testSimple(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t - np.array([1,2,3]), [0,0,0]))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t - np.array([1, 2, 3]), [0, 0, 0]))
 
     def testInplace(self):
-        t = TensorBase(np.array([1,2,3]))
-        t -= np.array([1,2,3])
-        self.assertTrue(np.array_equal(t.data, [0,0,0]))
+        t = TensorBase(np.array([1, 2, 3]))
+        t -= np.array([1, 2, 3])
+        self.assertTrue(syft.equal(t.data, [0, 0, 0]))
 
     def testScalar(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t - 1, [0, 1, 2]))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t - 1, [0, 1, 2]))
+
 
 class MultTests(unittest.TestCase):
     def testSimple(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t * np.array([1,2,3]), [1,4,9]))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t * np.array([1, 2, 3]), [1, 4, 9]))
 
     def testInplace(self):
-        t = TensorBase(np.array([1,2,3]))
-        t *= np.array([1,2,3])
-        self.assertTrue(np.array_equal(t.data, [1,4,9]))
+        t = TensorBase(np.array([1, 2, 3]))
+        t *= np.array([1, 2, 3])
+        self.assertTrue(syft.equal(t.data, [1, 4, 9]))
 
     def testScalar(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t * 2, [2, 4, 6]))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t * 2, [2, 4, 6]))
+
 
 class DivTests(unittest.TestCase):
     def testSimple(self):
-        t = TensorBase(np.array([2,4,8]))
-        self.assertTrue(np.array_equal(t / np.array([2,2,2]), [1,2,4]))
+        t = TensorBase(np.array([2, 4, 8]))
+        self.assertTrue(syft.equal(t / np.array([2, 2, 2]), [1, 2, 4]))
 
     def testInplace(self):
-        t = TensorBase(np.array([1,2,3]))
-        t *= np.array([1,2,3])
-        self.assertTrue(np.array_equal(t.data, [1,4,9]))
+        t = TensorBase(np.array([1, 2, 3]))
+        t *= np.array([1, 2, 3])
+        self.assertTrue(syft.equal(t.data, [1, 4, 9]))
 
     def testScalar(self):
-        t = TensorBase(np.array([2,4,6]))
-        self.assertTrue(np.array_equal(t / 2, [1, 2, 3]))
+        t = TensorBase(np.array([2, 4, 6]))
+        self.assertTrue(syft.equal(t / 2, [1, 2, 3]))
+
 
 class ShapeTests(unittest.TestCase):
     def testShape(self):
         t = TensorBase(np.array([[0, 1], [0, 5]]))
-        self.assertTrue(np.array_equal(t.shape(), (2, 2)))
+        self.assertTrue(syft.equal(t.shape(), (2, 2)))
+
 
 class SumTests(unittest.TestCase):
     def testDimNoneInt(self):
-        t = TensorBase(np.array([1,2,3]))
-        self.assertTrue(np.array_equal(t.sum(), 6))
+        t = TensorBase(np.array([1, 2, 3]))
+        self.assertTrue(syft.equal(t.sum(), 6))
 
     def testDimIsNotNoneInt(self):
         t = TensorBase(np.array([[0, 1], [0, 5]]))
-        self.assertTrue(np.array_equal(t.sum(dim=1), [1, 5]))
+        self.assertTrue(syft.equal(t.sum(dim=1), [1, 5]))
+
+
+class EqualTests(unittest.TestCase):
+    def testEqual(self):
+        t1 = TensorBase(np.array([1.2, 2, 3]))
+        t2 = TensorBase(np.array([1.2, 2, 3]))
+        self.assertTrue(syft.equal(t1, t2))
+
+    def testEqOp(self):
+        t1 = TensorBase(np.array([1, 2.4, 3]))
+        t2 = TensorBase(np.array([1, 2.4, 3]))
+        self.assertTrue(t1 == t2)
+
+    def testNotEqual(self):
+        t1 = TensorBase(np.array([1, 2, 3]))
+        t2 = TensorBase(np.array([1, 4, 3]))
+        self.assertFalse(syft.equal(t1, t2))
+
+    def testIneqOp(self):
+        t1 = TensorBase(np.array([1, 2, 3]))
+        t2 = TensorBase(np.array([1, 4, 5]))
+        self.assertTrue(t1 != t2)
+
 
 def main():
     unittest.main()
 
+
 if __name__ == '__main__':
     main()

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
anyio==3.6.2
argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
args==0.1.0
async-generator==1.10
attrs==22.2.0
Babel==2.11.0
backcall==0.2.0
bleach==4.1.0
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
clint==0.5.1
comm==0.1.4
contextvars==2.4
dataclasses==0.8
decorator==5.1.1
defusedxml==0.7.1
entrypoints==0.4
idna==3.10
immutables==0.19
importlib-metadata==4.8.3
iniconfig==1.1.1
ipykernel==5.5.6
ipython==7.16.3
ipython-genutils==0.2.0
ipywidgets==7.8.5
jedi==0.17.2
Jinja2==3.0.3
json5==0.9.16
jsonschema==3.2.0
jupyter==1.1.1
jupyter-client==7.1.2
jupyter-console==6.4.3
jupyter-core==4.9.2
jupyter-server==1.13.1
jupyterlab==3.2.9
jupyterlab-pygments==0.1.2
jupyterlab-server==2.10.3
jupyterlab_widgets==1.1.11
line-profiler==4.1.3
MarkupSafe==2.0.1
mistune==0.8.4
nbclassic==0.3.5
nbclient==0.5.9
nbconvert==6.0.7
nbformat==5.1.3
nest-asyncio==1.6.0
notebook==6.4.10
numpy==1.19.5
packaging==21.3
pandocfilters==1.5.1
parso==0.7.1
pexpect==4.9.0
phe==1.5.0
pickleshare==0.7.5
pluggy==1.0.0
prometheus-client==0.17.1
prompt-toolkit==3.0.36
ptyprocess==0.7.0
py==1.11.0
pycparser==2.21
Pygments==2.14.0
pyparsing==3.1.4
pyRserve==1.0.4
pyrsistent==0.18.0
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
pyzmq==25.1.2
requests==2.27.1
Send2Trash==1.8.3
six==1.17.0
sniffio==1.2.0
-e git+https://github.com/OpenMined/PySyft.git@bde42bc82a49bd636c9e0d63bb845aa4bcb1e288#egg=syft
terminado==0.12.1
testpath==0.6.0
tomli==1.2.3
tornado==6.1
traitlets==4.3.3
typing_extensions==4.1.1
urllib3==1.26.20
wcwidth==0.2.13
webencodings==0.5.1
websocket-client==1.3.1
widgetsnbextension==3.6.10
zipp==3.6.0

name: PySyft
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - anyio==3.6.2
      - argon2-cffi==21.3.0
      - argon2-cffi-bindings==21.2.0
      - args==0.1.0
      - async-generator==1.10
      - attrs==22.2.0
      - babel==2.11.0
      - backcall==0.2.0
      - bleach==4.1.0
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - clint==0.5.1
      - comm==0.1.4
      - contextvars==2.4
      - dataclasses==0.8
      - decorator==5.1.1
      - defusedxml==0.7.1
      - entrypoints==0.4
      - idna==3.10
      - immutables==0.19
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - ipykernel==5.5.6
      - ipython==7.16.3
      - ipython-genutils==0.2.0
      - ipywidgets==7.8.5
      - jedi==0.17.2
      - jinja2==3.0.3
      - json5==0.9.16
      - jsonschema==3.2.0
      - jupyter==1.1.1
      - jupyter-client==7.1.2
      - jupyter-console==6.4.3
      - jupyter-core==4.9.2
      - jupyter-server==1.13.1
      - jupyterlab==3.2.9
      - jupyterlab-pygments==0.1.2
      - jupyterlab-server==2.10.3
      - jupyterlab-widgets==1.1.11
      - line-profiler==4.1.3
      - markupsafe==2.0.1
      - mistune==0.8.4
      - nbclassic==0.3.5
      - nbclient==0.5.9
      - nbconvert==6.0.7
      - nbformat==5.1.3
      - nest-asyncio==1.6.0
      - notebook==6.4.10
      - numpy==1.19.5
      - packaging==21.3
      - pandocfilters==1.5.1
      - parso==0.7.1
      - pexpect==4.9.0
      - phe==1.5.0
      - pickleshare==0.7.5
      - pluggy==1.0.0
      - prometheus-client==0.17.1
      - prompt-toolkit==3.0.36
      - ptyprocess==0.7.0
      - py==1.11.0
      - pycparser==2.21
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pyrserve==1.0.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyzmq==25.1.2
      - requests==2.27.1
      - send2trash==1.8.3
      - six==1.17.0
      - sniffio==1.2.0
      - terminado==0.12.1
      - testpath==0.6.0
      - tomli==1.2.3
      - tornado==6.1
      - traitlets==4.3.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - wcwidth==0.2.13
      - webencodings==0.5.1
      - websocket-client==1.3.1
      - widgetsnbextension==3.6.10
      - zipp==3.6.0
prefix: /opt/conda/envs/PySyft

tests/test_math.py::DotTests::testDotFloat tests/test_math.py::DotTests::testDotInt tests/test_math.py::MatmulTests::testMatmul1DFloat tests/test_math.py::MatmulTests::testMatmul1DInt tests/test_math.py::MatmulTests::testMatmul2DFloat tests/test_math.py::MatmulTests::testMatmul2DIdentity tests/test_math.py::MatmulTests::testMatmul2DInt tests/test_tensor.py::DimTests::testDimOne tests/test_tensor.py::AddTests::testInplace tests/test_tensor.py::AddTests::testScalar tests/test_tensor.py::AddTests::testSimple tests/test_tensor.py::SubTests::testInplace tests/test_tensor.py::SubTests::testScalar tests/test_tensor.py::SubTests::testSimple tests/test_tensor.py::MultTests::testInplace tests/test_tensor.py::MultTests::testScalar tests/test_tensor.py::MultTests::testSimple tests/test_tensor.py::DivTests::testInplace tests/test_tensor.py::DivTests::testScalar tests/test_tensor.py::DivTests::testSimple tests/test_tensor.py::ShapeTests::testShape tests/test_tensor.py::SumTests::testDimIsNotNoneInt tests/test_tensor.py::SumTests::testDimNoneInt tests/test_tensor.py::EqualTests::testEqOp tests/test_tensor.py::EqualTests::testEqual tests/test_tensor.py::EqualTests::testNotEqual
tests/test_tensor.py::EqualTests::testIneqOp
syft/tensor.py __init__.py syft/math.py syft/__init__.py
syft/tensor.py __init__.py syft/math.py syft/__init__.py