Repository: incubator-singa
Updated Branches:
refs/heads/master e9b2c964c -> c967169bc
SINGA-259 Add maven pom file for building java classes
This ticket would refactor some API in *.i files and create the pom.xml
to use maven to compile the java classes. Java unittest is also enabled
with a simple example.
To test this ticket,
1. compile singa with java (cuda and cudnn are optional) in `build/`
cmake -DUSE_JAVA=ON -DUSE_PYTHON=OFF ..
make
2. goto build/java and run the unit tests
export LD_LIBRARY_PATH=<path to
build>/java/lib:$LD_LIBRARY_PATH
mvn test
The folder structure for the java project is
java/
pom.xml
lib/libsinga_wrap.so
src/
main/java/org/apache/singa/
swig/
proto/
test/org/apache/singa/
Fixed a bug in tensor.py::from_numpy() which handled int array incorrectly.
Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/c967169b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/c967169b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/c967169b
Branch: refs/heads/master
Commit: c967169bc1832239fc79a89171e8b372a04e143b
Parents: e9b2c96
Author: Wei Wang <[email protected]>
Authored: Mon Oct 10 15:48:00 2016 +0800
Committer: Wei Wang <[email protected]>
Committed: Mon Oct 10 23:49:48 2016 +0800
----------------------------------------------------------------------
cmake/Dependencies.cmake | 4 +-
java/CMakeLists.txt | 61 ++---
java/pom.xml | 38 +++
.../test/java/org/apache/singa/TestTensor.java | 59 +++++
python/CMakeLists.txt | 24 +-
python/singa/tensor.py | 150 ++++++------
src/CMakeLists.txt | 8 +-
src/api/core_device.i | 8 +-
src/api/core_tensor.i | 230 +++++++------------
src/api/io_snapshot.i | 4 +-
src/api/model_layer.i | 22 +-
src/core/tensor/tensor.cc | 3 +-
src/core/tensor/tensor_math_cpp.h | 7 +
src/proto/core.proto | 2 +-
src/proto/io.proto | 2 +-
src/proto/model.proto | 2 +-
test/python/test_tensor.py | 19 +-
17 files changed, 358 insertions(+), 285 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/cmake/Dependencies.cmake
----------------------------------------------------------------------
diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake
index d9dbae7..6ad15c0 100644
--- a/cmake/Dependencies.cmake
+++ b/cmake/Dependencies.cmake
@@ -95,7 +95,7 @@ IF(USE_PYTHON)
ENDIF()
IF(USE_JAVA)
- FIND_PACKAGE(Java)
- FIND_PACKAGE(JNI )
+ FIND_PACKAGE(Java REQUIRED)
+ FIND_PACKAGE(JNI REQUIRED)
FIND_PACKAGE(SWIG 3.0 REQUIRED)
ENDIF()
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/java/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt
index ef38461..7f44198 100644
--- a/java/CMakeLists.txt
+++ b/java/CMakeLists.txt
@@ -19,9 +19,19 @@
# This following function is taken from
# https://github.com/Kitware/CMake/blob/master/Modules/FindProtobuf.cmake
# and modified to our compilation.
+function(CAPTALIZE_STRING INPUT OUTPUT)
+ string(TOUPPER ${ARGV0} UPP)
+ string(LENGTH ${ARGV0} LEN)
+ string(SUBSTRING ${UPP} 0 1 PREFIX)
+ math(EXPR LEN "${LEN} - 1")
+ string(SUBSTRING ${ARGV0} 1 ${LEN} SUFFIX)
+ string(CONCAT RET ${PREFIX} ${SUFFIX})
+ set(${OUTPUT} ${RET} PARENT_SCOPE)
+endfunction()
+
function(PROTOBUF_GENERATE_JAVA OUTPUT)
if(NOT ARGN)
- message(SEND_ERROR "Error: PROTOBUF_GENERATE_JAVA() called
+ message(SEND_ERROR "Error: PROTOBUF_GENERATE_JAVA() called
without any proto files")
return()
endif(NOT ARGN)
@@ -31,18 +41,18 @@ function(PROTOBUF_GENERATE_JAVA OUTPUT)
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
get_filename_component(PATH ${FIL} PATH)
-
- list(APPEND ${OUTPUT}
"${CMAKE_BINARY_DIR}/java/singa/proto/${FIL_WE}.java")
+ CAPTALIZE_STRING(${FIL_WE} FIL_WE1)
+ list(APPEND ${OUTPUT}
"${CMAKE_BINARY_DIR}/java/src/main/java/org/apache/singa/proto/${FIL_WE1}.java")
add_custom_command(
- OUTPUT "${CMAKE_BINARY_DIR}/java/singa/proto/${FIL_WE}.java"
+ OUTPUT
"${CMAKE_BINARY_DIR}/java/src/main/java/org/apache/singa/proto/${FIL_WE1}.java"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
- ARGS --java_out ${CMAKE_BINARY_DIR}/java
+ ARGS --java_out ${CMAKE_BINARY_DIR}/java/src/main/java
--proto_path ${PATH} ${ABS_FIL}
DEPENDS ${ABS_FIL}
COMMENT "Running java protocol buffer compiler on ${FIL}" VERBATIM)
endforeach()
-
+
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED
TRUE)
set(${OUTPUT} ${${OUTPUT}} PARENT_SCOPE)
endfunction()
@@ -62,6 +72,7 @@ function (create_symlinks)
# Get OS dependent path to use in `execute_process`
file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${path_file}" link)
file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${path_file}" target)
+ # MESSAGE(STATUS "${link}->${target}")
if (UNIX)
set(command ln -s ${target} ${link})
@@ -69,7 +80,7 @@ function (create_symlinks)
set(command cmd.exe /c mklink ${link} ${target})
endif()
- execute_process(COMMAND ${command}
+ execute_process(COMMAND ${command}
RESULT_VARIABLE result
ERROR_VARIABLE output)
@@ -80,38 +91,37 @@ function (create_symlinks)
endforeach(path_file)
endfunction(create_symlinks)
+# generate cxx and wrap.py
+file(MAKE_DIRECTORY
${CMAKE_BINARY_DIR}/java/src/main/java/org/apache/singa/swig)
+file(MAKE_DIRECTORY
${CMAKE_BINARY_DIR}/java/src/main/java/org/apache/singa/proto)
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/java/src/test/java/org/apache/singa)
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/java/lib)
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/api)
# generate protobuf sources
FILE(GLOB proto_files ${CMAKE_SOURCE_DIR}/src/proto/*.proto)
PROTOBUF_GENERATE_JAVA(proto_javas ${proto_files})
-MESSAGE(STATUS "proto javas: ${proto_javas}")
+# MESSAGE(STATUS "proto javas: ${proto_javas}")
-# generate cxx and wrap.py
-if(NOT EXISTS "${CMKAE_BINARY_DIR}/java")
- execute_process(
- COMMAND mkdir ${CMAKE_BINARY_DIR}/java
- COMMAND mkdir ${CMAKE_BINARY_DIR}/java/singa
- COMMAND mkdir ${CMAKE_BINARY_DIR}/java/singa/proto
- ERROR_QUIET)
-endif()
execute_process(
- COMMAND mkdir ${CMAKE_BINARY_DIR}/src/api
- COMMAND swig -c++ -java -I${CMAKE_SOURCE_DIR}/include
+ COMMAND swig -c++ -java -I${CMAKE_SOURCE_DIR}/include
-I${JAVA_INCLUDE_PATH} -I${JAVA_INCLUDE_PATH2}
- -outdir ${CMAKE_BINARY_DIR}/java/singa
- -package singa
+ -package org.apache.singa.swig
+ -outdir ${CMAKE_BINARY_DIR}/java/src/main/java/org/apache/singa/swig
-o ${CMAKE_BINARY_DIR}/src/api/singa_java_wrap.cxx
- ${CMAKE_SOURCE_DIR}/src/api/singa.i )
+ ${CMAKE_SOURCE_DIR}/src/api/singa.i)
#MESSAGE(STATUS "java include: ${JAVA_INCLUDE_DIRS} ${JNI_INCLUDE_DIRS}
${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}")
set(java_srcs "${CMAKE_BINARY_DIR}/src/api/singa_java_wrap.cxx")
#Create symlinks for all java source files Do not omit !!!RELATIVE!!!
file(GLOB_RECURSE java_source_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
*.java)
+file(GLOB_RECURSE java_xml_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.xml)
+list(APPEND java_source_files ${java_xml_files})
create_symlinks(${java_source_files})
IF(USE_CUDA)
-# remain this custom command to avoid cuda objs can't find
+# remain this custom command to avoid cuda objs can't find
ADD_CUSTOM_COMMAND(
OUTPUT ${global_cuda_objs}
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/"
@@ -124,15 +134,14 @@ TARGET_LINK_LIBRARIES(singa_wrap ${SINGA_LINKER_LIBS}
${JNI_LIBRARIES})
TARGET_INCLUDE_DIRECTORIES(singa_wrap PRIVATE ${JAVA_INCLUDE_PATH}
${JAVA_INCLUDE_PATH2})
SET_TARGET_PROPERTIES(singa_wrap
- PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/java/singa
+ PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/java/lib
)
IF(APPLE)
ADD_CUSTOM_TARGET(
- change_suffix ALL
- COMMAND ${CMAKE_COMMAND} -E rename
"${CMAKE_BINARY_DIR}/java/singa/libsinga_wrap.dylib"
"${CMAKE_BINARY_DIR}/java/singa/libsinga_wrap.so"
+ change_suffix ALL
+ COMMAND ${CMAKE_COMMAND} -E rename
"${CMAKE_BINARY_DIR}/java/lib/libsinga_wrap.dylib"
"${CMAKE_BINARY_DIR}/java/lib/libsinga_wrap.so"
COMMENT "change .dylib to .so in mac system"
)
ADD_DEPENDENCIES(change_suffix _singa_wrap)
ENDIF(APPLE)
-
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/java/pom.xml
----------------------------------------------------------------------
diff --git a/java/pom.xml b/java/pom.xml
new file mode 100644
index 0000000..e29faec
--- /dev/null
+++ b/java/pom.xml
@@ -0,0 +1,38 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+ http://maven.apache.org/maven-4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.singa</groupId>
+ <artifactId>junit-tests</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+ <name>junit-tests</name>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.5</version>
+ <scope>compile</scope>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
-->
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ <version>2.6.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/java/src/test/java/org/apache/singa/TestTensor.java
----------------------------------------------------------------------
diff --git a/java/src/test/java/org/apache/singa/TestTensor.java
b/java/src/test/java/org/apache/singa/TestTensor.java
new file mode 100644
index 0000000..c66f41a
--- /dev/null
+++ b/java/src/test/java/org/apache/singa/TestTensor.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package test;
+
+import org.apache.singa.swig.*;
+
+
+import junit.framework.*;
+import static org.junit.Assert.*;
+
+public class TestTensor extends TestCase {
+
+ protected void setUp(){
+ System.loadLibrary("singa_wrap");
+ }
+ public void testTensorFunc() {
+ Shape s = new Shape(2);
+ s.set(0, 2);
+ s.set(1, 3);
+
+ Tensor t1 = new Tensor(s);
+ t1.SetFloatValue(0.1f);
+ Tensor t2 = singa_wrap.Square(t1);
+ float[] data = new float[6];
+
+ t2.GetFloatValue(data, 6);
+ for(int i = 0; i < 6; i++)
+ assertEquals(data[i], 0.01, 1e-4);
+
+ for (int i =0; i< 6; i++)
+ data[i] = i * 1.0f;
+ Tensor t3 = new Tensor(s);
+ t3.CopyFloatDataFromHostPtr(data, 6);
+
+
+ t3.GetFloatValue(data, 6);
+ for(int i = 0; i < 6; i++)
+ assertEquals(data[i], i * 1.0f, 1e-4);
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/python/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 8bf8319..7774af0 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -21,7 +21,7 @@
# and modified to our compilation.
function(PROTOBUF_GENERATE_PYTHON OUTPUT)
if(NOT ARGN)
- message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called
+ message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called
without any proto files")
return()
endif(NOT ARGN)
@@ -42,7 +42,7 @@ function(PROTOBUF_GENERATE_PYTHON OUTPUT)
DEPENDS ${ABS_FIL}
COMMENT "Running Python protocol buffer compiler on ${FIL}"
VERBATIM)
endforeach()
-
+
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED
TRUE)
set(${OUTPUT} ${${OUTPUT}} PARENT_SCOPE)
endfunction()
@@ -72,7 +72,7 @@ function (create_symlinks)
set(command cmd.exe /c mklink ${link} ${target})
endif()
- execute_process(COMMAND ${command}
+ execute_process(COMMAND ${command}
RESULT_VARIABLE result
ERROR_VARIABLE output)
@@ -90,19 +90,13 @@ PROTOBUF_GENERATE_PYTHON(proto_pys ${proto_files})
#MESSAGE(STATUS "proto pys: ${proto_pys}")
# generate cxx and wrap.py
-if(NOT EXISTS "${CMKAE_BINARY_DIR}/python")
- execute_process(
- COMMAND mkdir ${CMAKE_BINARY_DIR}/python
- COMMAND mkdir ${CMAKE_BINARY_DIR}/python/singa
- COMMAND mkdir ${CMAKE_BINARY_DIR}/python/singa/proto
- ERROR_QUIET)
-endif()
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python/singa/proto)
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/src/api)
execute_process(
- COMMAND mkdir ${CMAKE_BINARY_DIR}/src/api
- COMMAND swig -c++ -python -I${CMAKE_SOURCE_DIR}/include
+ COMMAND swig -c++ -python -I${CMAKE_SOURCE_DIR}/include
-outdir ${CMAKE_BINARY_DIR}/python/singa
-o ${CMAKE_BINARY_DIR}/src/api/singa_wrap.cxx
- ${CMAKE_SOURCE_DIR}/src/api/singa.i )
+ ${CMAKE_SOURCE_DIR}/src/api/singa.i)
set(python_srcs "${CMAKE_BINARY_DIR}/src/api/singa_wrap.cxx")
@@ -112,7 +106,7 @@ create_symlinks(${python_source_files})
IF(USE_CUDA)
-# remain this custom command to avoid cuda objs can't find
+# remain this custom command to avoid cuda objs can't find
ADD_CUSTOM_COMMAND(
OUTPUT ${global_cuda_objs}
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/"
@@ -137,7 +131,7 @@ FILE(WRITE
${CMAKE_BINARY_DIR}/python/singa/proto/__init__.py "")
#MESSAGE(STATUS "apple: ${APPLE}")
IF(APPLE)
ADD_CUSTOM_TARGET(
- change_suffix ALL
+ change_suffix ALL
COMMAND ${CMAKE_COMMAND} -E rename
"${CMAKE_BINARY_DIR}/python/singa/_singa_wrap.dylib"
"${CMAKE_BINARY_DIR}/python/singa/_singa_wrap.so"
COMMENT "change .dylib to .so in mac system"
)
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/python/singa/tensor.py
----------------------------------------------------------------------
diff --git a/python/singa/tensor.py b/python/singa/tensor.py
index d08b6cb..c28f5b5 100644
--- a/python/singa/tensor.py
+++ b/python/singa/tensor.py
@@ -42,7 +42,7 @@ Example usage::
s = r.to_numpy() # tensor -> numpy array, r must be on cpu
-There are two set of tensor functions,
+There are two sets of tensor functions,
Tensor member functions
which would change the internal state of the Tensor instance.
@@ -192,7 +192,7 @@ class Tensor(object):
'''
# assert type(x) == float, 'set value only accepts float input'
# if isinstance(x, float):
- self.singa_tensor.floatSetValue(x)
+ self.singa_tensor.SetFloatValue(float(x))
def copy_from_numpy(self, np_array, offset=0):
''' Copy the data from the numpy array.
@@ -206,9 +206,9 @@ class Tensor(object):
np_array = np_array.flatten()
dt = np_array.dtype
if dt == np.float32:
- self.singa_tensor.floatCopyDataFromHostPtr(np_array)
+ self.singa_tensor.CopyFloatDataFromHostPtr(np_array)
elif dt == np.int or dt == np.int32:
- self.singa_tensor.intCopyDataFromHostPtr(np_array)
+ self.singa_tensor.CopyIntDataFromHostPtr(np_array)
else:
print 'Not implemented yet for ', dt
@@ -256,7 +256,7 @@ class Tensor(object):
Args:
p (float): with probability p, each element is sample to 1.
'''
- singa.floatBernoulli(float(p), self.singa_tensor)
+ singa.Bernoulli(float(p), self.singa_tensor)
def gaussian(self, mean, std):
'''Generate a value for each element following a Gaussian distribution.
@@ -265,7 +265,7 @@ class Tensor(object):
mean (float): mean of the distribution
std (float): standard variance of the distribution
'''
- singa.floatGaussian(float(mean), float(std), self.singa_tensor)
+ singa.Gaussian(float(mean), float(std), self.singa_tensor)
def uniform(self, low, high):
'''Generate a value for each element following a uniform distribution.
@@ -274,7 +274,7 @@ class Tensor(object):
low (float): the lower bound
high (float): the hight bound
'''
- singa.floatUniform(float(low), float(high), self.singa_tensor)
+ singa.Uniform(float(low), float(high), self.singa_tensor)
def add_column(self, v):
'''Add a tensor to each column of this tensor.
@@ -384,91 +384,91 @@ class Tensor(object):
def __add__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(singa.Add_TT,
- self.singa_tensor, rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__add__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.Add_Tf,
+ return _call_singa_func(singa.AddFloat,
self.singa_tensor, rhs)
def __sub__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(singa.Sub_TT,
- self.singa_tensor, rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__sub__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.Sub_Tf,
+ return _call_singa_func(singa.SubFloat,
self.singa_tensor, rhs)
def __mul__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(singa.EltwiseMul_TT,
- self.singa_tensor, rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__mul__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.EltwiseMul_Tf,
+ return _call_singa_func(singa.EltwiseMulFloat,
self.singa_tensor, rhs)
def __div__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(singa.Div_TT,
- self.singa_tensor, rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__div__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.Div_Tf,
+ return _call_singa_func(singa.DivFloat,
self.singa_tensor, rhs)
def __lt__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(singa.LT_TT, self.singa_tensor,
- rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__lt__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.LT_Tf, self.singa_tensor, rhs)
+ return _call_singa_func(singa.LTFloat, self.singa_tensor, rhs)
def __le__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(
- singa.LE_TT,
- self.singa_tensor,
- rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__le__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.LE_Tf, self.singa_tensor, rhs)
+ return _call_singa_func(singa.LEFloat, self.singa_tensor, rhs)
def __gt__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(
- singa.GT_TT,
- self.singa_tensor,
- rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__gt__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.GT_Tf, self.singa_tensor, rhs)
+ return _call_singa_func(singa.GTFloat, self.singa_tensor, rhs)
def __ge__(self, rhs):
if isinstance(rhs, Tensor):
- return _call_singa_func(
- singa.GE_TT,
- self.singa_tensor,
- rhs.singa_tensor)
+ return from_raw_tensor(
+ singa.__ge__(self.singa_tensor, rhs.singa_tensor))
else:
- return _call_singa_func(singa.GE_Tf, self.singa_tensor, rhs)
+ return _call_singa_func(singa.GEFloat, self.singa_tensor, rhs)
def __radd__(self, lhs):
lhs = float(lhs)
- return _call_singa_func(singa.Add_Tf, self.singa_tensor, lhs)
+ one = Tensor(self.shape, self.device, self.dtype)
+ one.set_value(lhs)
+ one += self
+ return one
def __rsub__(self, lhs):
lhs = float(lhs)
- ret = _call_singa_func(singa.Sub_Tf, self.singa_tensor, lhs)
- ret *= -1
- return ret
+ one = Tensor(self.shape, self.device, self.dtype)
+ one.set_value(lhs)
+ one -= self
+ return one
def __rmul__(self, lhs):
lhs = float(lhs)
- return _call_singa_func(singa.EltwiseMul_Tf, self.singa_tensor, lhs)
+ one = Tensor(self.shape, self.device, self.dtype)
+ one.set_value(lhs)
+ one *= self
+ return one
def __rdiv__(self, lhs):
lhs = float(lhs)
one = Tensor(self.shape, self.device, self.dtype)
- one.set_value(1)
- one *= lhs
- return _call_singa_func(singa.Div_TT, one.singa_tensor,
- self.singa_tensor)
+ one.set_value(lhs)
+ one /= self
+ return one
''' python functions for global functions in Tensor.h
'''
@@ -538,7 +538,21 @@ def from_numpy(np_array):
Returns:
A Tensor instance allocated on the default CppCPU device.
'''
- ret = Tensor(np_array.shape)
+ assert type(np_array) is np.ndarray, 'Must input numpy array'
+ # convert to float32 array
+ if np_array.dtype == np.float64 or np_array.dtype == np.float:
+ np_array = np_array.astype(np.float32)
+
+ if np_array.dtype == np.int64 or np_array.dtype == np.int:
+ np_array = np_array.astype(np.int32)
+
+ if np_array.dtype == np.float32:
+ dtype = core_pb2.kFloat32
+ else:
+ assert np_array.dtype == np.int32, \
+ 'Only float and int tensors are supported'
+ dtype = core_pb2.kInt
+ ret = Tensor(np_array.shape, dtype=dtype)
ret.copy_from_numpy(np_array)
return ret
@@ -559,9 +573,9 @@ def to_numpy(t):
'Please move the tensor onto the default host device'
if t.dtype == core_pb2.kFloat32:
- np_array = t.singa_tensor.floatGetValue(int(t.size()))
+ np_array = t.singa_tensor.GetFloatValue(int(t.size()))
elif t.dtype == core_pb2.kInt:
- np_array = t.singa_tensor.intGetValue(int(t.size()))
+ np_array = t.singa_tensor.GetIntValue(int(t.size()))
else:
print 'Not implemented yet for ', t.dtype
return np_array.reshape(t.shape)
@@ -670,7 +684,7 @@ def sum(t, axis=None):
'''
if axis is None:
- return singa.floatSum(t.singa_tensor)
+ return singa.SumAsFloat(t.singa_tensor)
else:
return _call_singa_func(singa.Sum, t.singa_tensor, axis)
@@ -691,12 +705,12 @@ def pow(t, x, out=None):
if isinstance(x, Tensor):
return _call_singa_func(singa.Pow, t.singa_tensor, x.singa_tensor)
else:
- return _call_singa_func(singa.Pow_f, t.singa_tensor, x)
+ return _call_singa_func(singa.PowFloat, t.singa_tensor, x)
else:
if isinstance(x, Tensor):
- singa.Pow(t.singa_tensor, x.singa_tensor, out.singa_tensor)
+ singa.PowWithRet(t.singa_tensor, x.singa_tensor, out.singa_tensor)
else:
- singa.Pow_f_out(t.singa_tensor, x, out.singa_tensor)
+ singa.PowFloatWitRet(t.singa_tensor, x, out.singa_tensor)
return out
@@ -714,7 +728,7 @@ def average(t, axis=None):
if t.ndim() > 1:
return _call_singa_func(singa.Average, t.singa_tensor, axis)
else:
- return singa.floatSum(t.singa_tensor) / t.size()
+ return singa.SumAsFloat(t.singa_tensor) / t.size()
def softmax(t, out=None):
@@ -809,7 +823,7 @@ def add(lhs, rhs, ret=None):
if isinstance(rhs, Tensor):
singa.Add(lhs.singa_tensor, rhs.singa_tensor, ret.singa_tensor)
else:
- singa.Add_Tf_out(lhs.singa_tensor, rhs, ret.singa_tensor)
+ singa.AddFloatWithRet(lhs.singa_tensor, rhs, ret.singa_tensor)
return ret
@@ -832,7 +846,7 @@ def sub(lhs, rhs, ret=None):
if isinstance(rhs, Tensor):
singa.Sub(lhs.singa_tensor, rhs.singa_tensor, ret.singa_tensor)
else:
- singa.Sub_Tf_out(lhs.singa_tensor, rhs, ret.singa_tensor)
+ singa.SubFloatWithRet(lhs.singa_tensor, rhs, ret.singa_tensor)
return ret
@@ -857,8 +871,8 @@ def eltwise_mult(lhs, rhs, ret=None):
singa.EltwiseMult(lhs.singa_tensor, rhs.singa_tensor,
ret.singa_tensor)
else:
- singa.EltwiseMult_Tf_out(lhs.singa_tensor, rhs,
- ret.singa_tensor)
+ singa.EltwiseMultFloatWithRet(lhs.singa_tensor, rhs,
+ ret.singa_tensor)
return ret
@@ -882,8 +896,8 @@ def mult(A, B, C=None, alpha=1.0, beta=0.0):
if C is None:
return _call_singa_func(singa.Mult, A.singa_tensor, B.singa_tensor)
else:
- singa.floatMult(alpha, A.singa_tensor, B.singa_tensor,
- beta, C.singa_tensor)
+ singa.MultWithScale(alpha, A.singa_tensor, B.singa_tensor,
+ beta, C.singa_tensor)
return C
@@ -906,7 +920,7 @@ def div(lhs, rhs, ret=None):
if isinstance(rhs, Tensor):
singa.Div(lhs.singa_tensor, rhs.singa_tensor, ret.singa_tensor)
else:
- singa.Div_Tf_out(lhs.singa_tensor, rhs, ret.singa_tensor)
+ singa.DivFloatWithRet(lhs.singa_tensor, rhs, ret.singa_tensor)
return ret
@@ -921,7 +935,7 @@ def axpy(alpha, x, y):
Returns:
y
'''
- singa.floatAxpy(float(alpha), x.singa_tensor, y.singa_tensor)
+ singa.Axpy(float(alpha), x.singa_tensor, y.singa_tensor)
return y
@@ -935,7 +949,7 @@ def bernoulli(p, t):
Returns:
t
'''
- singa.floatBernoulli(float(p), t.singa_tensor)
+ singa.Bernoulli(float(p), t.singa_tensor)
return t
@@ -950,7 +964,7 @@ def gaussian(mean, std, t):
Returns:
t
'''
- singa.floatGaussian(float(mean), float(std), t.singa_tensor)
+ singa.Gaussian(float(mean), float(std), t.singa_tensor)
return t
@@ -965,7 +979,7 @@ def uniform(low, high, t):
Returns:
t
'''
- singa.floatUniform(float(low), float(high), t.singa_tensor)
+ singa.Uniform(float(low), float(high), t.singa_tensor)
return t
@@ -982,8 +996,8 @@ def add_column(alpha, v, beta, M):
Returns:
M
'''
- singa.floatAddColumn(float(alpha), float(beta), v.singa_tensor,
- M.singa_tensor)
+ singa.AddColumnWithScale(float(alpha), float(beta), v.singa_tensor,
+ M.singa_tensor)
return M
@@ -1000,7 +1014,7 @@ def add_row(alpha, v, beta, M):
Returns:
M
'''
- singa.floatAddRow(alpha, beta, v.singa_tensor, M.singa_tensor)
+ singa.AddRowWithScale(alpha, beta, v.singa_tensor, M.singa_tensor)
return M
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b9526a3..8ef4732 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -73,19 +73,19 @@ FOREACH(fil ${proto_hdrs})
TARGET copy_protobuf POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${fil}
"${CMAKE_BINARY_DIR}/include/singa/proto/${filename}"
- DEPENDS ${proto_files}
+ DEPENDS ${proto_files}
)
ENDFOREACH()
ADD_LIBRARY(singa_objects OBJECT ${singa_sources})
-IF(WIN32)
+IF(WIN32)
ADD_LIBRARY(singa STATIC $<TARGET_OBJECTS:singa_objects> ${cuda_objs})
TARGET_LINK_LIBRARIES(singa ${SINGA_LINKER_LIBS})
IF (MSVC)
ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
IF(DISABLE_WARNINGS)
ADD_DEFINITIONS(-DDISABLE_WARNINGS)
- SET_TARGET_PROPERTIES(singa_objects
+ SET_TARGET_PROPERTIES(singa_objects
PROPERTIES COMPILE_FLAGS "/wd4244 /wd4267 /wd4018 /wd4005 /wd4804
/wd4800")
ENDIF()
ENDIF()
@@ -97,7 +97,7 @@ IF(UNIX OR APPLE)
TARGET_LINK_LIBRARIES(singa ${SINGA_LINKER_LIBS})
ENDIF()
-#pass configure infor to swig
+#pass configure infor to swig
FILE(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/api/config.i")
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/api/config.i.in"
"${CMAKE_CURRENT_SOURCE_DIR}/api/config.i")
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/api/core_device.i
----------------------------------------------------------------------
diff --git a/src/api/core_device.i b/src/api/core_device.i
index f3381ae..a9bb840 100644
--- a/src/api/core_device.i
+++ b/src/api/core_device.i
@@ -35,10 +35,10 @@
%shared_ptr(singa::Device);
namespace std{
-%template(sizePair) std::pair<size_t, size_t>;
-%template(vectorPair) std::vector<std::pair<size_t, size_t>>;
-%template(vectorSharedPtr) std::vector<std::shared_ptr<singa::Device>>;
-%template(deviceVec) std::vector<int>;
+%template(PairSizeT) std::pair<size_t, size_t>;
+%template(VecPairSizeT) std::vector<std::pair<size_t, size_t>>;
+%template(VecSharedPtrDevice) std::vector<std::shared_ptr<singa::Device>>;
+%template(VecInt) std::vector<int>;
}
namespace singa{
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/api/core_tensor.i
----------------------------------------------------------------------
diff --git a/src/api/core_tensor.i b/src/api/core_tensor.i
index d85e7f0..31562c9 100644
--- a/src/api/core_tensor.i
+++ b/src/api/core_tensor.i
@@ -22,18 +22,11 @@
/*interface file for swig */
%module core_tensor
+%include "config.i"
%include "std_vector.i"
%include "std_string.i"
%include "std_shared_ptr.i"
-/*
-%include "carrays.i"
-%array_class(float, floatArray);
-%array_class(int, intArray);
-%array_class(char, charArray);
-%array_class(double, doubleArray);
-*/
-
%{
#define SWIG_FILE_WITH_INIT
#include "singa/core/tensor.h"
@@ -49,8 +42,6 @@ using singa::DataType;
%init %{
import_array();
%}
-#endif //USE_PYTHON
-
%apply (float *IN_ARRAY1, int DIM1) {
(const float *src, const size_t num)
}
@@ -63,6 +54,15 @@ using singa::DataType;
%apply (int *ARGOUT_ARRAY1, int DIM1) {
(int *value, const size_t num)
}
+#endif // USE_PYTHON
+
+#if USE_JAVA
+%include "arrays_java.i"
+%apply int[] {int *};
+%apply float[] {float *};
+#endif // USE_JAVA
+
+
%template(Shape) std::vector<size_t>;
@@ -84,21 +84,18 @@ namespace singa{
explicit Tensor(const std::vector<size_t> &shape,
DataType dtype = kFloat32);
Tensor(const std::vector<size_t> &shape,
- std::shared_ptr<singa::Device> dev, DataType dtype = kFloat32);
+ std::shared_ptr<singa::Device> dev,
+ DataType dtype = kFloat32);
Tensor(const Tensor &from);
std::shared_ptr<singa::Device> device() const;
-/*
- template <typename DType> const DType* data() const;
- %template(floatData) data<float>;
- %template(intData) data<int>;
- %template(charData) data<char>;
- %template(doubleData) data<double>;
- */
template <typename SType> void GetValue(SType* value, const size_t num);
- %template(floatGetValue) GetValue<float>;
- %template(intGetValue) GetValue<int>;
+ %template(GetFloatValue) GetValue<float>;
+ %template(GetIntValue) GetValue<int>;
+
+ template <typename SType> void SetValue(const SType x);
+ %template(SetFloatValue) SetValue<float>;
const DataType data_type() const;
const std::vector<size_t> &shape() const;
@@ -115,45 +112,39 @@ namespace singa{
float L2() const;
float L1() const;
- template <typename SType> void SetValue(const SType x);
- %template(floatSetValue) SetValue<float>;
- /* TODO(chonho-01) other types */
- // --- other types
-
template <typename DType> void CopyDataFromHostPtr(const DType *src,
const size_t num,
const size_t offset =
0);
- %template(floatCopyDataFromHostPtr) CopyDataFromHostPtr<float>;
- %template(intCopyDataFromHostPtr) CopyDataFromHostPtr<int>;
- // --- other types
+ %template(CopyFloatDataFromHostPtr) CopyDataFromHostPtr<float>;
+ %template(CopyIntDataFromHostPtr) CopyDataFromHostPtr<int>;
void CopyData(const Tensor &other);
Tensor Clone() const;
Tensor T() const;
- /* python has no assignment operator
- Tensor &operator=(const Tensor &t); */
+#if USE_JAVA
+ %rename(iAdd) operator+=(const Tensor &t);
+ %rename(iSub) operator-=(const Tensor &t);
+ %rename(iMul) operator*=(const Tensor &t);
+ %rename(iDiv) operator/=(const Tensor &t);
+#endif // USE_JAVA
+
Tensor &operator+=(const Tensor &t);
Tensor &operator-=(const Tensor &t);
Tensor &operator*=(const Tensor &t);
Tensor &operator/=(const Tensor &t);
-
template <typename DType> Tensor &operator+=(const DType x);
- %template(iAdd_f) operator+=<float>;
- // --- other types
+ %template(iAddFloat) operator+=<float>;
template <typename DType> Tensor &operator-=(DType x);
- %template(iSub_f) operator-=<float>;
- // --- other types
+ %template(iSubFloat) operator-=<float>;
template <typename DType> Tensor &operator*=(DType x);
- %template(iMul_f) operator*=<float>;
- // --- other types
+ %template(iMulFloat) operator*=<float>;
template <typename DType> Tensor &operator/=(DType x);
- %template(iDiv_f) operator/=<float>;
- // --- other types
+ %template(iDivFloat) operator/=<float>;
/*TODO(chonho-04)
@@ -161,8 +152,6 @@ namespace singa{
amin
asum
*/
-
-
};
void CopyDataToFrom(Tensor *dst, const Tensor &src, size_t num,
@@ -182,180 +171,139 @@ namespace singa{
Tensor Sum(const Tensor &t, int axis);
template <typename SType> SType Sum(const Tensor &t);
- %template(floatSum) Sum<float>;
- // --- other types
+ %template(SumAsFloat) Sum<float>;
- /* TODO(chonho-02)
- need to implement the average of all elements ??? */
Tensor Average(const Tensor &t, int axis);
Tensor SoftMax(const Tensor &t);
-
Tensor Pow(const Tensor &base, const Tensor &exp);
+
+ %rename(PowWithRet) Pow(const Tensor &base, const Tensor &exp, Tensor *out);
void Pow(const Tensor &base, const Tensor &exp, Tensor *out);
- %rename(Pow_f) Pow(const Tensor &in, const float x);
- template <typename SType>
- Tensor Pow(const Tensor &in, const SType x);
- %template(pow_temp) Pow<float>;
+ template <typename SType> Tensor Pow(const Tensor &in, const SType x);
+ %template(PowFloat) Pow<float>;
- %rename(Pow_f_out) Pow(const Tensor &in, const float x, Tensor *out);
template <typename SType>
void Pow(const Tensor &in, const SType x, Tensor *out);
- %template(pow_temp) Pow<float>;
-
+ %template(PowFloatWithRet) Pow<float>;
- /* rename comparison operators */
- %rename(LT_Tf) operator<(const Tensor &t, const float x);
- %rename(LE_Tf) operator<=(const Tensor &t, const float x);
- %rename(GT_Tf) operator>(const Tensor &t, const float x);
- %rename(GE_Tf) operator>=(const Tensor &t, const float x);
- %rename(LT_TT) operator<(const Tensor &lhs, const Tensor &rhs);
- %rename(LE_TT) operator<=(const Tensor &lhs, const Tensor &rhs);
- %rename(GT_TT) operator>(const Tensor &lhs, const Tensor &rhs);
- %rename(GE_TT) operator>=(const Tensor &lhs, const Tensor &rhs);
+ %rename(__lt__) operator<(const Tensor &lhs, const Tensor &rhs);
+ %rename(__le__) operator<=(const Tensor &lhs, const Tensor &rhs);
+ %rename(__gt__) operator>(const Tensor &lhs, const Tensor &rhs);
+ %rename(__ge__) operator>=(const Tensor &lhs, const Tensor &rhs);
Tensor operator<(const Tensor &lhs, const Tensor &rhs);
Tensor operator<=(const Tensor &lhs, const Tensor &rhs);
Tensor operator>(const Tensor &lhs, const Tensor &rhs);
Tensor operator>=(const Tensor &lhs, const Tensor &rhs);
+ %rename(LTFloat) operator<(const Tensor &t, const float x);
template <typename DType>
Tensor operator<(const Tensor &t, const DType x);
- %template(op) operator< <float>;
- // --- other types
+ %template(oplt) operator< <float>;
- template <typename DType>
- Tensor operator<=(const Tensor &t, const DType x);
- %template(op) operator<= <float>;
- // --- other types
-
- template <typename DType>
- Tensor operator>(const Tensor &t, const DType x);
- %template(op) operator> <float>;
- // --- other types
-
- template <typename DType>
- Tensor operator>=(const Tensor &t, const DType x);
- %template(op) operator>= <float>;
- // --- other types
+ %rename(LEFloat) operator<=(const Tensor &t, const float x);
+ template <typename DType> Tensor operator<=(const Tensor &t, const DType x);
+ %template(ople) operator<= <float>;
- /* NOTE(chonho)
- no need to include theses
- in python, these can be replaced with comparison operators
+ %rename(GTFloat) operator>(const Tensor &t, const float x);
+ template <typename DType> Tensor operator>(const Tensor &t, const DType x);
+ %template(opgt) operator> <float>;
- template <typename DType>
- void LT(const Tensor &t, DType x, Tensor *ret);
- template <typename DType>
- void LE(const Tensor &t, DType x, Tensor *ret);
- template <typename DType>
- void GT(const Tensor &t, DType x, Tensor *ret);
- template <typename DType>
- void GE(const Tensor &t, DType x, Tensor *ret);
- */
+ %rename(GEFloat) operator>=(const Tensor &t, const float x);
+ template <typename DType> Tensor operator>=(const Tensor &t, const DType x);
+ %template(opge) operator>= <float>;
/* ========== Arithmetic operations ========== */
- %rename(Add_TT) operator+(const Tensor &lhs, const Tensor &rhs);
- %rename(Sub_TT) operator-(const Tensor &lhs, const Tensor &rhs);
- %rename(EltwiseMul_TT) operator*(const Tensor &lhs, const Tensor &rhs);
- %rename(Div_TT) operator/(const Tensor &lhs, const Tensor &rhs);
+ %rename(__add__) operator+(const Tensor &lhs, const Tensor &rhs);
+ %rename(__sub__) operator-(const Tensor &lhs, const Tensor &rhs);
+ %rename(__mul__) operator*(const Tensor &lhs, const Tensor &rhs);
+ %rename(__div__) operator/(const Tensor &lhs, const Tensor &rhs);
Tensor operator+(const Tensor &lhs, const Tensor &rhs);
Tensor operator-(const Tensor &lhs, const Tensor &rhs);
Tensor operator*(const Tensor &lhs, const Tensor &rhs);
Tensor operator/(const Tensor &lhs, const Tensor &rhs);
-
- %rename(Add_Tf) operator+(const Tensor &t, float x);
- template <typename DType>
- Tensor operator+(const Tensor &t, DType x);
- %template(op) operator+<float>;
- // --- other types
-
- %rename(Sub_Tf) operator-(const Tensor &t, float x);
- template <typename DType>
- Tensor operator-(const Tensor &t, DType x);
- %template(op) operator-<float>;
- // --- other types
-
- %rename(EltwiseMul_Tf) operator*(const Tensor &t, float x);
- template <typename DType>
- Tensor operator*(const Tensor &t, DType x);
- %template(op) operator*<float>;
- // --- other types
-
- %rename(Div_Tf) operator/(const Tensor &t, float x);
- template <typename DType>
- Tensor operator/(const Tensor &t, DType x);
- %template(op) operator/<float>;
- // --- other types
-
void Add(const Tensor &lhs, const Tensor &rhs, Tensor *ret);
void Sub(const Tensor &lhs, const Tensor &rhs, Tensor *ret);
void EltwiseMult(const Tensor &lhs, const Tensor &rhs, Tensor *ret);
void Div(const Tensor &lhs, const Tensor &rhs, Tensor *ret);
- template <typename DType>
- void Add(const Tensor &t, DType x, Tensor *ret);
- %template(Add_Tf_out) Add<float>;
- // --- other types
+ %rename(AddFloat) operator+(const Tensor &t, float x);
+ template <typename DType> Tensor operator+(const Tensor &t, DType x);
+ %template(opadd) operator+ <float>;
+
+ %rename(SubFloat) operator-(const Tensor &t, float x);
+ template <typename DType> Tensor operator-(const Tensor &t, DType x);
+ %template(opsub) operator- <float>;
+
+ %rename(MultFloat) operator*(const Tensor &t, float x);
+ template <typename DType> Tensor operator*(const Tensor &t, DType x);
+ %template(opmul) operator* <float>;
+
+ %rename(DivFloat) operator/(const Tensor &t, float x);
+ template <typename DType> Tensor operator/(const Tensor &t, DType x);
+ %template(opdiv) operator/ <float>;
+
+ template <typename DType> void Add(const Tensor &t, DType x, Tensor *ret);
+ %template(AddFloatWithRet) Add<float>;
template <typename DType>
void Sub(const Tensor &t, DType x, Tensor *ret);
- %template(Sub_Tf_out) Sub<float>;
- // --- other types
+ %template(SubFloatWithRet) Sub<float>;
template <typename DType>
void EltwiseMult(const Tensor &t, DType x, Tensor *ret);
- %template(EltwiseMult_Tf_out) EltwiseMult<float>;
- // --- other types
+ %template(EltwiseMultFloatWithRet) EltwiseMult<float>;
template <typename DType>
void Div(const Tensor &t, DType x, Tensor *ret);
- %template(Div_Tf_out) Div<float>;
- // --- other types
+ %template(DivFloatWithRet) Div<float>;
/* ========== Random operations ========== */
template <typename SType>
void Bernoulli(const SType p, Tensor *out);
- %template(floatBernoulli) Bernoulli<float>;
- // --- other types
+ %template(Bernoulli) Bernoulli<float>;
template <typename SType>
void Gaussian(const SType mean, const SType std, Tensor *out);
- %template(floatGaussian) Gaussian<float>;
- // --- other types
+ %template(Gaussian) Gaussian<float>;
template <typename SType>
void Uniform(const SType low, const SType high, Tensor *out);
- %template(floatUniform) Uniform<float>;
- // --- other types
+ %template(Uniform) Uniform<float>;
+
/* ========== Blas operations ========== */
template <typename SType>
void Axpy(SType alpha, const Tensor &in, Tensor *out);
- %template(floatAxpy) Axpy<float>;
- // --- other types
+ %template(Axpy) Axpy<float>;
Tensor Mult(const Tensor &A, const Tensor &B);
+ %rename(MultWithRet) Mult(const Tensor &A, const Tensor &B, Tensor *C);
void Mult(const Tensor &A, const Tensor &B, Tensor *C);
template <typename SType>
void Mult(const SType alpha, const Tensor &A, const Tensor &B,
const SType beta, Tensor *C);
- %template(floatMult) Mult<float>;
+ %template(MultWithScale) Mult<float>;
+
+
+ /* =========== Matrix operations ==========*/
void AddColumn(const Tensor &v, Tensor *M);
template <typename SType>
void AddColumn(const SType alpha, const SType beta, const Tensor &v,
Tensor *M);
- %template(floatAddColumn) AddColumn<float>;
+ %template(AddColumnWithScale) AddColumn<float>;
void AddRow(const Tensor &v, Tensor *M);
template <typename SType>
void AddRow(const SType alpha, const SType beta, const Tensor &v,
Tensor *M);
- %template(floatAddRow) AddRow<float>;
+ %template(AddRowWithScale) AddRow<float>;
void DivColumn(const Tensor &v, Tensor *M);
void DivRow(const Tensor &v, Tensor *M);
@@ -369,6 +317,4 @@ namespace singa{
Tensor SoftMax(const Tensor &in);
void SoftMax(const Tensor &in, Tensor *out);
-
}
-
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/api/io_snapshot.i
----------------------------------------------------------------------
diff --git a/src/api/io_snapshot.i b/src/api/io_snapshot.i
index 2203295..8413a1f 100644
--- a/src/api/io_snapshot.i
+++ b/src/api/io_snapshot.i
@@ -28,8 +28,8 @@
%}
namespace std{
-%template(nametensorPair) std::pair<string, singa::Tensor>;
-%template(nametensorVec) std::vector<std::pair<string, singa::Tensor>>;
+%template(PairStrTensor) std::pair<string, singa::Tensor>;
+%template(VecPairStrTensor) std::vector<std::pair<string, singa::Tensor>>;
}
namespace singa {
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/api/model_layer.i
----------------------------------------------------------------------
diff --git a/src/api/model_layer.i b/src/api/model_layer.i
index ae651d5..31b2cb6 100644
--- a/src/api/model_layer.i
+++ b/src/api/model_layer.i
@@ -49,11 +49,11 @@ using singa::LayerConf;
#endif
namespace std {
- %template(strVector) vector<string>;
- %template(paramVector) vector<singa::ParamSpec>;
- %template(tensorVector) vector<singa::Tensor>;
- %template(ttvecPair) pair<singa::Tensor, vector<singa::Tensor>>;
- %template(tvecPair) pair<vector<singa::Tensor>, vector<singa::Tensor>>;
+ %template(VecStr) vector<string>;
+ %template(VecParamSpec) vector<singa::ParamSpec>;
+ %template(VecTensor) vector<singa::Tensor>;
+ %template(PairTensorVecTensor) pair<singa::Tensor, vector<singa::Tensor>>;
+ %template(PairVecTensor) pair<vector<singa::Tensor>, vector<singa::Tensor>>;
}
@@ -80,6 +80,7 @@ class Layer {
std::shared_ptr<Layer> CreateLayer(const std::string& type);
const std::vector<std::string> GetRegisteredLayers();
+
class RNN : public Layer {
};
@@ -88,12 +89,13 @@ class RNN : public Layer {
class CudnnRNN : public RNN {
public:
// note: Must use std::vector instead of vector.
- const std::vector<Tensor> Forward(int flag, const std::vector<Tensor>&
inputs) override;
- const std::pair<std::vector<Tensor>, std::vector<Tensor>> Backward(
- int flag, const std::vector<Tensor>& grads) override;
+ const std::vector<Tensor> Forward(int flag,
+ const std::vector<Tensor>& inputs)
override;
+ const std::pair<std::vector<Tensor>, std::vector<Tensor>>
+ Backward(int flag, const std::vector<Tensor>& grads) override;
void ToDevice(std::shared_ptr<Device> device) override;
- const std::vector<Tensor> param_values() override;
- const std::vector<size_t> GetOutputSampleShape() const override;
+ const std::vector<Tensor> param_values() override;
+ const std::vector<size_t> GetOutputSampleShape() const override;
};
#endif // CUDNN_VERSION_SWIG >= 5005
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/core/tensor/tensor.cc
----------------------------------------------------------------------
diff --git a/src/core/tensor/tensor.cc b/src/core/tensor/tensor.cc
index d96b2ec..424edb2 100644
--- a/src/core/tensor/tensor.cc
+++ b/src/core/tensor/tensor.cc
@@ -479,13 +479,14 @@ void Tensor::SetValue(const SType x) {
auto size = Size();
auto ptr = block_;
TYPE_LANG_SWITCH(data_type_, DType, device_->lang(), Lang, {
- // cast x to DType
+ // TODO(wangwei) cast x to DType
device_->Exec([size, x, ptr](Context *ctx) {
Set<DType, Lang>(size, x, ptr, ctx);
}, {}, {ptr});
});
}
template void Tensor::SetValue<float>(const float x);
+template void Tensor::SetValue<int>(const int x);
#define EltwiseUnaryTensorFn(fn, t, ret) \
do { \
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/core/tensor/tensor_math_cpp.h
----------------------------------------------------------------------
diff --git a/src/core/tensor/tensor_math_cpp.h
b/src/core/tensor/tensor_math_cpp.h
index edae209..f7e2b37 100644
--- a/src/core/tensor/tensor_math_cpp.h
+++ b/src/core/tensor/tensor_math_cpp.h
@@ -256,6 +256,13 @@ void Set<float, lang::Cpp>(const size_t num, const float
x, Block *out,
for (size_t i = 0; i < num; i++) outPtr[i] = x;
}
template <>
+void Set<int, lang::Cpp>(const size_t num, const int x, Block *out,
+ Context *ctx) {
+ int *outPtr = static_cast<int *>(out->mutable_data());
+ for (size_t i = 0; i < num; i++) outPtr[i] = x;
+}
+
+template <>
void Sigmoid<float, lang::Cpp>(const size_t num, const Block *in, Block *out,
Context *ctx) {
float *outPtr = static_cast<float *>(out->mutable_data());
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/proto/core.proto
----------------------------------------------------------------------
diff --git a/src/proto/core.proto b/src/proto/core.proto
index d455a9e..9264e55 100644
--- a/src/proto/core.proto
+++ b/src/proto/core.proto
@@ -18,7 +18,7 @@
package singa;
-option java_package = "singa.proto";
+option java_package = "org.apache.singa.proto";
// TODO(wangwei) check protobuf version to include the syntax
//syntax = "proto2";
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/proto/io.proto
----------------------------------------------------------------------
diff --git a/src/proto/io.proto b/src/proto/io.proto
index ab56983..e7ef21f 100644
--- a/src/proto/io.proto
+++ b/src/proto/io.proto
@@ -18,7 +18,7 @@
package singa;
-option java_package = "singa.proto";
+option java_package = "org.apache.singa.proto";
message EncoderConf {
optional string type = 1 [default = "jpg2proto"];
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/src/proto/model.proto
----------------------------------------------------------------------
diff --git a/src/proto/model.proto b/src/proto/model.proto
index 6be5e0a..545b556 100644
--- a/src/proto/model.proto
+++ b/src/proto/model.proto
@@ -18,7 +18,7 @@
package singa;
-option java_package = "singa.proto";
+option java_package = "org.apache.singa.proto";
/// \file layer.proto is adapted from [Caffe](https://github.com/BVLC/caffe/)'s
/// proto file with commit id c419f8517b1e1b3d7a07fe212fc6c90a70b519ea. We
/// use caffe's protocol for configuring layer hyper-parameters for easy
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/c967169b/test/python/test_tensor.py
----------------------------------------------------------------------
diff --git a/test/python/test_tensor.py b/test/python/test_tensor.py
index a1f220b..9cd2411 100644
--- a/test/python/test_tensor.py
+++ b/test/python/test_tensor.py
@@ -16,12 +16,9 @@
# under the License.
# =============================================================================
-import sys
-import os
import math
import unittest
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '../../build/python'))
+import numpy as np
from singa import tensor
@@ -132,34 +129,40 @@ class TestTensorMethods(unittest.TestCase):
x.gaussian(1, 0.01)
self.assertAlmostEqual(tensor.average(x), 1, 3)
-
def test_radd(self):
x = tensor.Tensor((3,))
x.set_value(1)
y = 1 + x
self.assertEqual(tensor.average(y), 2.)
-
def test_rsub(self):
x = tensor.Tensor((3,))
x.set_value(1)
y = 1 - x
self.assertEqual(tensor.average(y), 0.)
-
def test_rmul(self):
x = tensor.Tensor((3,))
x.set_value(1)
y = 2 * x
self.assertEqual(tensor.average(y), 2.)
-
def test_rdiv(self):
x = tensor.Tensor((3,))
x.set_value(1)
y = 2 / x
self.assertEqual(tensor.average(y), 2.)
+ def test_numpy_convert(self):
+ a = np.asarray([[1, 0, 0], [0, 1, 0]], dtype=np.int)
+ t = tensor.from_numpy(a)
+ b = tensor.to_numpy(t)
+ self.assertEqual(np.sum(a-b), 0)
+
+ a = np.asarray([[1, 0, 0], [0, 1, 0]], dtype=np.float32)
+ t = tensor.from_numpy(a)
+ b = tensor.to_numpy(t)
+ self.assertEqual(np.sum(a-b), 0.)
if __name__ == '__main__':