Merge PR #185 for more py tensor functions.
remove Tensor member func to_numpy, and keep global to_numpy


Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/cde7dcf6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/cde7dcf6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/cde7dcf6

Branch: refs/heads/dev
Commit: cde7dcf6bbee2931ea14cac30edd639dd490c691
Parents: f026b60 d83f5d5
Author: Wei Wang <[email protected]>
Authored: Fri Jul 1 16:15:06 2016 +0800
Committer: Wei Wang <[email protected]>
Committed: Fri Jul 1 16:22:06 2016 +0800

----------------------------------------------------------------------
 include/singa/core/device.h    |    7 +-
 include/singa/core/tensor.h    |    7 +
 include/singa/model/layer.h    |    5 +-
 src/core/device/device.cc      |    2 +
 src/core/tensor/tensor.cc      |   17 +-
 src/python/swig/core_device.i  |    9 +-
 src/python/swig/core_tensor.i  |  167 +-
 src/python/swig/model_layer.i  |   13 +-
 src/python/swig/numpy.i        | 3119 +++++++++++++++++++++++++++++++++++
 src/python/tensor.py           |  225 ++-
 test/python/unittest_python.py |  102 +-
 11 files changed, 3545 insertions(+), 128 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/cde7dcf6/src/python/tensor.py
----------------------------------------------------------------------
diff --cc src/python/tensor.py
index 04e070d,35d6b1f..19af454
--- a/src/python/tensor.py
+++ b/src/python/tensor.py
@@@ -92,6 -89,29 +89,19 @@@ class Tensor(object)
          data = np.array(data, dtype=dt).reshape(self.tuple_shape)
          return data
  
 -    def to_numpy(self):
 -        ''' this method gets the values of tensor data and
 -            returns it as numpy array
 -        '''
 -        if self.dtype == kFloat32:
 -            np_array = self.singa_tensor.floatGetValue(int(self.size()))
 -        else:
 -            print 'Not implemented yet for ', self.dtype
 -        return np_array.reshape(self.tuple_shape)
 -
+     def copy_from_numpy(self, np_array, offset=0):
+         ''' this method stores the values of numpy array into tensor data
+             from the position of offset
+         '''
+         assert np_array.size == self.size(), 'tensor shape should be the same'
+         if not np_array.ndim == 1:
+             np_array = np_array.flatten()
+         dt = np_array.dtype
+         if dt == np.float32:
+             self.singa_tensor.floatCopyDataFromHostPtr(np_array, offset)
+         else:
+             print 'Not implemented yet for ', dt
+ 
      def data_type(self):
          return self.singa_tensor.data_type()
  
@@@ -256,9 -310,19 +300,27 @@@ def reshape(t, s)
      return _call_singa_func(singa.Reshape, t.singa_tensor, s)
  
  
- def copy_data_to_from(dst, src, size, src_offset=0, dst_offset=0):
+ def copy_data_to_from(dst, src, size, dst_offset=0, src_offset=0):
      singa.CopyDataToFrom(dst.singa_tensor, src.singa_tensor, size,
-                          src_offset, dst_offset)
+                          dst_offset, src_offset)
+ 
+ 
+ def from_numpy(np_array):
+     ret = Tensor(np_array.shape)
+     ret.copy_from_numpy(np_array)
+     return ret
+ 
+ 
+ def to_numpy(t):
 -    return t.to_numpy()
++    ''' this method gets the values of tensor data and
++        returns it as numpy array
++        TODO(wangwei) clone t to host
++    '''
++    if t.dtype == kFloat32:
++        np_array = t.singa_tensor.floatGetValue(int(t.size()))
++    else:
++        print 'Not implemented yet for ', t.dtype
++    return np_array.reshape(t.tuple_shape)
  
  
  def abs(t):

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/cde7dcf6/test/python/unittest_python.py
----------------------------------------------------------------------
diff --cc test/python/unittest_python.py
index e1f4b64,320703d..86830a0
--- a/test/python/unittest_python.py
+++ b/test/python/unittest_python.py
@@@ -36,6 -36,6 +36,7 @@@ sys.path.append(os.path.join(os.path.di
                               '../../build/src'))
  from core_pb2 import *
  
++
  class TestTensorMethods(unittest.TestCase):
  
      def setUp(self):
@@@ -57,83 -57,93 +58,98 @@@
  
      def test_unary_operators(self):
          t = self.t
-         self.assertAlmostEqual(t.toarray()[0,0], 0.0)
 -        arr = np.array([[1.0,2.0],[2.0,3.0],[3.0,4.0]], dtype=np.float32)
++        arr = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], dtype=np.float32)
+         t.copy_from_numpy(arr)
 -        self.assertAlmostEqual(t.to_numpy()[0,0], arr[0,0])
 -        self.assertAlmostEqual(t.to_numpy()[0,1], arr[0,1])
 -        self.assertAlmostEqual(t.to_numpy()[2,1], arr[2,1])
++        npary = to_numpy(t)
++        self.assertAlmostEqual(npary[0, 0], arr[0, 0])
++        self.assertAlmostEqual(npary[0, 1], arr[0, 1])
++        self.assertAlmostEqual(npary[2, 1], arr[2, 1])
          t += 1.23
-         self.assertAlmostEqual(t.toarray()[0,0], 1.23)
 -        self.assertAlmostEqual(to_numpy(t)[0,0], 1.0+1.23)
++        npary = to_numpy(t)
++        self.assertAlmostEqual(npary[0, 0], 1.0+1.23)
          t -= 0.23
-         self.assertAlmostEqual(t.toarray()[0,0], 1.23-0.23)
 -        self.assertAlmostEqual(to_numpy(t)[0,0], 2.23-0.23)
++        npary = to_numpy(t)
++        self.assertAlmostEqual(npary[0, 0], 2.23-0.23)
          t *= 2.5
-         self.assertAlmostEqual(t.toarray()[0,0], (1.23-0.23)*2.5)
 -        self.assertAlmostEqual(to_numpy(t)[0,0], (2.23-0.23)*2.5)
++        npary = to_numpy(t)
++        self.assertAlmostEqual(npary[0, 0], (2.23-0.23)*2.5)
          t /= 2
-         self.assertAlmostEqual(t.toarray()[0,0], (1.23-0.23)*2.5/2)
 -        self.assertAlmostEqual(to_numpy(t)[0,0], (2.23-0.23)*2.5/2)
++        npary = to_numpy(t)
++        self.assertAlmostEqual(npary[0, 0], (2.23-0.23)*2.5/2)
  
      def test_binary_operators(self):
          t = self.t
-         t += 3.2
 -        arr = np.array([[1.0,2.0],[2.0,3.0],[3.0,4.0]], dtype=np.float32)
++        arr = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], dtype=np.float32)
+         t.copy_from_numpy(arr)
          s = self.s
-         s += 2.1
 -        arr = np.array([[4.0,3.0],[3.0,2.0],[2.0,1.0]], dtype=np.float32)
++        arr = np.array([[4.0, 3.0], [3.0, 2.0], [2.0, 1.0]], dtype=np.float32)
+         s.copy_from_numpy(arr)
          a = t + s
-         self.assertAlmostEqual(a.toarray()[0,0], 3.2+2.1, 5)
 -        self.assertAlmostEqual(to_numpy(a)[0,0], 1.0+4.0)
++        self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0+4.0)
          a = t - s
-         self.assertAlmostEqual(a.toarray()[0,0], 3.2-2.1, 5)
 -        self.assertAlmostEqual(to_numpy(a)[0,0], 1.0-4.0)
++        self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0-4.0)
          a = t * s
-         self.assertAlmostEqual(a.toarray()[0,0], 3.2*2.1, 5)
-         ''' not implemented yet
 -        self.assertAlmostEqual(to_numpy(a)[0,0], 1.0*4.0)
++        self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0*4.0)
          a = t / s
-         self.assertAlmostEqual(a.toarray()[0,0], 3.2/2.1, 5)
-         '''
 -        self.assertAlmostEqual(to_numpy(a)[0,0], 1.0/4.0)
++        self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0/4.0)
  
      def test_comparison_operators(self):
          t = self.t
-         t += 3.45
+         t.set_value(3.45)
          a = t < 3.45
-         self.assertEqual(a.toarray()[0,0], 0)
 -        self.assertEqual(to_numpy(a)[0,0], 0)
++        self.assertEqual(to_numpy(a)[0, 0], 0)
          a = t <= 3.45
-         self.assertEqual(a.toarray()[0,0], 1)
 -        self.assertEqual(to_numpy(a)[0,0], 1)
++        self.assertEqual(to_numpy(a)[0, 0], 1)
          a = t > 3.45
-         self.assertEqual(a.toarray()[0,0], 0)
 -        self.assertEqual(to_numpy(a)[0,0], 0)
++        self.assertEqual(to_numpy(a)[0, 0], 0)
          a = t >= 3.45
-         self.assertEqual(a.toarray()[0,0], 1)
 -        self.assertEqual(to_numpy(a)[0,0], 1)
++        self.assertEqual(to_numpy(a)[0, 0], 1)
          a = lt(t, 3.45)
-         self.assertEqual(a.toarray()[0,0], 0)
 -        self.assertEqual(to_numpy(a)[0,0], 0)
++        self.assertEqual(to_numpy(a)[0, 0], 0)
          a = le(t, 3.45)
-         self.assertEqual(a.toarray()[0,0], 1)
 -        self.assertEqual(to_numpy(a)[0,0], 1)
++        self.assertEqual(to_numpy(a)[0, 0], 1)
          a = gt(t, 3.45)
-         self.assertEqual(a.toarray()[0,0], 0)
 -        self.assertEqual(to_numpy(a)[0,0], 0)
++        self.assertEqual(to_numpy(a)[0, 0], 0)
          a = ge(t, 3.45)
-         self.assertEqual(a.toarray()[0,0], 1)
 -        self.assertEqual(to_numpy(a)[0,0], 1)
++        self.assertEqual(to_numpy(a)[0, 0], 1)
+ 
+     def test_tensor_manipulation(self):
 -        #TODO(chonho)
++        # TODO(chonho)
+         pass
  
+     def test_random_operations(self):
 -        #TODO(chonho)
++        # TODO(chonho)
+         pass
  
      def test_tensor_copy(self):
--        t = Tensor((2,3))
-         t += 1.23
-         self.assertAlmostEqual(t.toarray()[0,0], 1.23)
++        t = Tensor((2, 3))
+         t.set_value(1.23)
 -        self.assertAlmostEqual(to_numpy(t)[0,0], 1.23)
++        self.assertAlmostEqual(to_numpy(t)[0, 0], 1.23)
          tc = t.copy()
          tdc = t.deepcopy()
-         self.assertAlmostEqual(tc.toarray()[0,0], 1.23)
-         self.assertAlmostEqual(tdc.toarray()[0,0], 1.23)
 -        self.assertAlmostEqual(to_numpy(tc)[0,0], 1.23)
 -        self.assertAlmostEqual(to_numpy(tdc)[0,0], 1.23)
++        self.assertAlmostEqual(to_numpy(tc)[0, 0], 1.23)
++        self.assertAlmostEqual(to_numpy(tdc)[0, 0], 1.23)
          t += 1.23
-         self.assertAlmostEqual(t.toarray()[0,0], 2.46)
-         self.assertAlmostEqual(tc.toarray()[0,0], 2.46)
-         self.assertAlmostEqual(tdc.toarray()[0,0], 1.23)
 -        self.assertAlmostEqual(to_numpy(t)[0,0], 2.46)
 -        self.assertAlmostEqual(to_numpy(tc)[0,0], 2.46)
 -        self.assertAlmostEqual(to_numpy(tdc)[0,0], 1.23)
++        self.assertAlmostEqual(to_numpy(t)[0, 0], 2.46)
++        self.assertAlmostEqual(to_numpy(tc)[0, 0], 2.46)
++        self.assertAlmostEqual(to_numpy(tdc)[0, 0], 1.23)
  
      def test_copy_data(self):
          t = self.t
-         t += 1.23
+         t.set_value(1.23)
          s = self.s
-         s += 5.43
-         self.assertAlmostEqual(t.toarray()[0,0], 1.23)
+         s.set_value(5.43)
 -        self.assertAlmostEqual(t.to_numpy()[0,0], 1.23)
++        self.assertAlmostEqual(to_numpy(t)[0, 0], 1.23)
          copy_data_to_from(t, s, 2)
-         self.assertAlmostEqual(t.toarray()[0,0], 5.43, 5)
-         self.assertAlmostEqual(t.toarray()[0,1], 5.43, 5)
-         self.assertAlmostEqual(t.toarray()[0,2], 1.23)
- 
 -        self.assertAlmostEqual(t.to_numpy()[0,0], 5.43, 5)
 -        self.assertAlmostEqual(t.to_numpy()[0,1], 5.43, 5)
 -        self.assertAlmostEqual(t.to_numpy()[1,0], 1.23, 5)
++        self.assertAlmostEqual(to_numpy(t)[0, 0], 5.43, 5)
++        self.assertAlmostEqual(to_numpy(t)[0, 1], 5.43, 5)
++        self.assertAlmostEqual(to_numpy(t)[1, 0], 1.23, 5)
  
      def test_global_method(self):
          t = self.t
-         t += 12.34
+         t.set_value(12.34)
          a = log(t)
-         self.assertAlmostEqual(a.toarray()[0,0], math.log(12.34))
 -        self.assertAlmostEqual(to_numpy(a)[0,0], math.log(12.34), 5)
++        self.assertAlmostEqual(to_numpy(a)[0, 0], math.log(12.34), 5)
  
  if __name__ == '__main__':
      unittest.main()

Reply via email to