You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@singa.apache.org by wa...@apache.org on 2016/06/03 07:48:18 UTC
[13/60] incubator-singa git commit: SINGA-163 - Reorganize the
project folder layout
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/mshadow/tensor_random.h
----------------------------------------------------------------------
diff --git a/include/mshadow/tensor_random.h b/include/mshadow/tensor_random.h
deleted file mode 100644
index ae2836a..0000000
--- a/include/mshadow/tensor_random.h
+++ /dev/null
@@ -1,369 +0,0 @@
-#ifndef MSHADOW_TENSOR_RANDOM_H
-#define MSHADOW_TENSOR_RANDOM_H
-/*!
- * \file tensor_random.h
- * \brief Random inline functions for tensor.
- * \author Bing Xu, Tianqi Chen
- * Based on curand|MKL|stdlib
- */
-#include <cstdlib>
-#include <random>
-#include <chrono>
-#include "tensor.h"
-#include "tensor_container.h"
-
-namespace mshadow {
- /*!
- * \brief random number generator
- * \tparam Device the device of random number generator
- *
- * Note: replaced rand (srand) with c++11's random functions.
- */
- template<typename Device>
- class Random {};
-
- /*! \brief CPU random number generator */
- template<>
- class Random<cpu> {
- public:
- /*!
- * \brief constructor of random engine using default seed
- */
- Random<cpu> (){
- // obtain a seed from the system clock:
- unsigned s= std::chrono::system_clock::now().time_since_epoch().count();
- Seed(s);
- }
- /*!
- * \brief constructor of random engine
- * \param seed random number seed
- */
- Random<cpu>( int seed ){
- #if MSHADOW_USE_MKL
- int status = vslNewStream(&vStream_, VSL_BRNG_MT19937, seed);
- utils::Assert( status == VSL_STATUS_OK, "MKL VSL Random engine failed to be initialized.\n" );
- #else
- //srand(seed);
- gen_.seed(seed);
- #endif
- buffer_.Resize( Shape1( kRandBufferSize ) );
- }
- ~Random<cpu>() {
- #if MSHADOW_USE_MKL
- vslDeleteStream(&vStream_);
- #endif
- }
- /*!
- * \brief seed random number generator using this seed
- * \param seed seed of prng
- */
- inline void Seed( int seed ){
- #if MSHADOW_USE_MKL
- int status = vslDeleteStream(&vStream_);
- utils::Assert(status == VSL_STATUS_OK);
- status = vslNewStream(&vStream_, VSL_BRNG_MT19937, seed);
- utils::Assert(status == VSL_STATUS_OK);
- #else
- // srand( seed );
- gen_.seed(seed);
- #endif
- }
- template<int dim>
- inline void SampleBinary(Tensor<cpu, dim> &src) {
- SampleBinary(src, src);
- }
-
- /*!
- * \brief generate binary data according to a probability matrix
- * \param src source
- * \param dst destination
- * \param a lower bound of uniform
- * \param b upper bound of uniform
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline void SampleBinary(Tensor<cpu, dim> &dst, Tensor<cpu, dim> &src) {
- real_t a=0.0f;
- real_t b=1.0f;
- Tensor<cpu, 2> dmat = dst.FlatTo2D();
- Tensor<cpu, 2> smat = src.FlatTo2D();
- std::uniform_real_distribution<real_t> distribution (a,b);
- for ( index_t i = 0; i < dmat.shape[1]; ++i ) {
- #if MSHADOW_USE_MKL
- #if MSHADOW_SINGLE_PRECISION
- int status = vsRngUniform( 0, vStream_, mat.shape[0], mat[i].dptr, a, b );
- #else
- int status = vdRngUniform( 0, vStream_, mat.shape[0], mat[i].dptr, a, b );
- #endif
- utils::Assert(status == VSL_STATUS_OK, "Failed to generate random number by MKL.\n" );
- #else
- // use stdlib
- /*
- for ( index_t j = 0; j < mat.shape[0]; ++j ) {
- mat[i][j] = this->RandNext()*(b-a) + a;
- }
- */
- for ( index_t j = 0; j < dmat.shape[0]; ++j ) {
- dmat[i][j] = distribution(gen_) > smat[i][j] ? 0.0f: 1.0f;
- }
- #endif
- }
- }
- /*!
- * \brief generate data from uniform [a,b)
- * \param dst destination
- * \param a lower bound of uniform
- * \param b upper bound of uniform
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline void SampleUniform( Tensor<cpu, dim> &dst, real_t a=0.0f, real_t b=1.0f ) {
- Tensor<cpu, 2> mat = dst.FlatTo2D();
- std::uniform_real_distribution<real_t> distribution (a,b);
- for ( index_t i = 0; i < mat.shape[1]; ++i ) {
- #if MSHADOW_USE_MKL
- #if MSHADOW_SINGLE_PRECISION
- int status = vsRngUniform( 0, vStream_, mat.shape[0], mat[i].dptr, a, b );
- #else
- int status = vdRngUniform( 0, vStream_, mat.shape[0], mat[i].dptr, a, b );
- #endif
- utils::Assert(status == VSL_STATUS_OK, "Failed to generate random number by MKL.\n" );
- #else
- // use stdlib
- /*
- for ( index_t j = 0; j < mat.shape[0]; ++j ) {
- mat[i][j] = this->RandNext()*(b-a) + a;
- }
- */
- for ( index_t j = 0; j < mat.shape[0]; ++j ) {
- mat[i][j] = distribution(gen_);
- }
- #endif
- }
- }
- /*!
- * \brief generate data from standard gaussian
- * \param dst destination
- * \param mu mean variable
- * \param sigma standard deviation
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline void SampleGaussian( Tensor<cpu, dim> &dst, real_t mu = 0.0f, real_t sigma = 1.0f ) {
- if( sigma <= 0.0f ) {
- dst = mu; return;
- }
- Tensor<cpu, 2> mat = dst.FlatTo2D();
- std::normal_distribution<real_t> distribution (mu, sigma);
- for (index_t i = 0; i < mat.shape[1]; ++i) {
- #if MSHADOW_USE_MKL
- #if MSHADOW_SINGLE_PRECISION
- int status = vsRngGaussian( 0, vStream_, mat.shape[0], mat[i].dptr, mu, sigma );
- #else
- int status = vdRngGaussian( 0, vStream_, mat.shape[0], mat[i].dptr, mu, sigma );
- #endif
- utils::Assert(status == VSL_STATUS_OK, "Failed to generate random number by MKL.\n" );
- #else
- /*
- real_t g1 = 0.0f, g2 = 0.0f;
- for (index_t j = 0; j < mat.shape[0]; ++j) {
- if( (j & 1) == 0 ){
- this->SampleNormal2D( g1, g2 );
- mat[i][j] = mu + g1 * sigma;
- }else{
- mat[i][j] = mu + g2 * sigma;
- }
- }
- */
- for (index_t j = 0; j < mat.shape[0]; ++j) {
- mat[i][j] = distribution(gen_);
- }
- #endif
- }
- }
- /*!
- * \brief return a temporal expression storing standard gaussian random variables
- * the temporal tensor is only valid before next call of gaussian or uniform
- * can be used as part of expression
- * Caution: this means expression such as A = gaussian(s1) * gaussian(s2) will give invalid result,
- * since second call of gaussian(s2) makes gaussian(s1) invalid
- * A = gaussian(s1)*B+C; is correct; use one gaussian/uniform in each expression
- * \param shape shape of the tensor
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline expr::ReshapeExp<Tensor<cpu,1>,dim,1> gaussian( Shape<dim> shape ){
- buffer_.Resize( Shape1( shape.Size() ) );
- this->SampleGaussian( buffer_, 0.0f, 1.0f );
- return expr::reshape( buffer_, shape );
- }
- /*!
- * \brief return a temporal expression storing standard uniform [0,1)
- * the temporal tensor is only valid before next call of gaussian or uniform
- * can be used as part of expression
- * Caution: this means expression such as A = gaussian(s1) * gaussian(s2) will give invalid result,
- * since second call of gaussian(s2) makes gaussian(s1) invalid
- * A = gaussian(s1)*B+C; is correct; use one gaussian/uniform in each expression
- * \param shape shape of the tensor
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline expr::ReshapeExp<Tensor<cpu,1>,dim,1> uniform( Shape<dim> shape ){
- buffer_.Resize( Shape1( shape.Size() ) );
- this->SampleUniform( buffer_, 0.0f, 1.0f );
- return expr::reshape( buffer_, shape );
- }
- private:
- /*! \brief get next random number from rand */
- inline real_t RandNext( void ){
- return static_cast<real_t>(rand()) / (static_cast<real_t>(RAND_MAX)+1.0f);
- }
- /*! \brief return a real numer uniform in (0,1) */
- inline real_t RandNext2( void ){
- return (static_cast<real_t>( rand() ) + 1.0 ) / (static_cast<real_t>(RAND_MAX) + 2.0);
- }
- /*!
- * \brief sample iid xx,yy ~N(0,1)
- * \param xx first gaussian output
- * \param yy second gaussian output
- */
- inline void SampleNormal2D( real_t &xx, real_t &yy ){
- real_t x,y,s;
- do{
- x = 2.0f * RandNext2() - 1.0f;
- y = 2.0f * RandNext2() - 1.0f;
- s = x*x + y*y;
- }while( s >= 1.0f || s == 0.0f );
- real_t t = std::sqrt( -2.0f * std::log( s ) / s ) ;
- xx = x * t; yy = y * t;
- }
- private:
- #if MSHADOW_USE_MKL
- /*! \brief stream used by MKL VSL */
- VSLStreamStatePtr vStream_;
- #endif
- /*! \brief temporal space used to store random numbers */
- TensorContainer<cpu,1> buffer_;
-
- /*! \brief c++11 random generator, added for SINGA use */
- std::mt19937 gen_;
- }; // class Random<cpu>
-
-#if MSHADOW_USE_CUDA
-// __CUDACC__
- /*! \brief GPU random number generator */
- template<>
- class Random<gpu> {
- public:
- /*!
- * \brief constructor of random engine
- * \param seed random number seed
- */
- Random<gpu>(int seed) {
- curandStatus_t status;
- status = curandCreateGenerator(&gen_, CURAND_RNG_PSEUDO_DEFAULT);
- utils::Assert(status == CURAND_STATUS_SUCCESS, "Can not create CURAND Generator");
- this->Seed( seed );
- buffer_.Resize( Shape1(kRandBufferSize) );
- }
-
- ~Random<gpu>() {
- curandStatus_t status;
- status = curandDestroyGenerator(gen_);
- utils::Assert(status == CURAND_STATUS_SUCCESS, "Destory CURAND Gen failed");
- }
- /*!
- * \brief seed random number generator using this seed
- * \param seed seed of prng
- */
- inline void Seed( int seed ){
- curandStatus_t status;
- status = curandSetPseudoRandomGeneratorSeed(gen_, seed);
- utils::Assert(status == CURAND_STATUS_SUCCESS, "Set CURAND seed failed.");
- }
- /*!
- * \brief generate data from uniform [a,b)
- * \param dst destination
- * \param a lower bound of uniform
- * \param b upper bound of uniform
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline void SampleUniform(Tensor<gpu, dim> &dst, real_t a=0.0f, real_t b=1.0f) {
- if( a == 0.0f && b == 1.0f ){
- dst = this->uniform( dst.shape );
- }else{
- dst = this->uniform( dst.shape ) *(b-a) + a;
- }
- }
- /*!
- * \brief generate data from standard gaussian
- * \param dst destination
- * \param mu mean variable
- * \param sigma standard deviation
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline void SampleGaussian(Tensor<gpu, dim> &dst, real_t mu = 0.0f, real_t sigma = 1.0f) {
- dst = this->gaussian( dst.shape, mu, sigma );
- }
- /*!
- * \brief return a temporal expression storing standard gaussian random variables
- * the temporal tensor is only valid before next call of gaussian or uniform
- * can be used as part of expression
- * Caution: this means expression such as A = gaussian(s1) * gaussian(s2) will give invalid result,
- * since second call of gaussian(s2) makes gaussian(s1) invalid
- * A = gaussian(s1)*B+C; is correct; use one gaussian/uniform in each expression
- * \param shape shape of the tensor
- * \param mu mean
- * \param sigma variance
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline expr::ReshapeExp<Tensor<gpu,1>,dim,1> gaussian( Shape<dim> shape, real_t mu=0.0f, real_t sigma=1.0f){
- size_t aligned_sz = ((shape.Size() + 1UL)>>1)<<1;
- // allocate alligned size
- buffer_.Resize( Shape1( aligned_sz ) );
- buffer_.Resize( Shape1( shape.Size() ) );
- curandStatus_t status;
- #if MSHADOW_SINGLE_PRECISION
- status = curandGenerateNormal(gen_, buffer_.dptr, aligned_sz , mu, sigma);
- #else
- status = curandGenerateNormalDouble(gen_, buffer_.dptr, buffer_.shape[0], mu, sigma);
- #endif
- utils::Assert(status == CURAND_STATUS_SUCCESS, "CURAND Gen Uniform failed\n");
- return expr::reshape( buffer_, shape );
- }
- /*!
- * \brief return a temporal expression storing standard uniform [0,1)
- * the temporal tensor is only valid before next call of gaussian or uniform
- * can be used as part of expression
- * Caution: this means expression such as A = gaussian(s1) * gaussian(s2) will give invalid result,
- * since second call of gaussian(s2) makes gaussian(s1) invalid
- * A = gaussian(s1)*B+C; is correct; use one gaussian/uniform in each expression
- * \param shape shape of the tensor
- * \tparam dim dimension of tensor
- */
- template<int dim>
- inline expr::ReshapeExp<Tensor<gpu,1>,dim,1> uniform(Shape<dim> shape) {
- buffer_.Resize( Shape1( shape.Size() ) );
- curandStatus_t status;
- #if MSHADOW_SINGLE_PRECISION
- status = curandGenerateUniform(gen_, buffer_.dptr, buffer_.shape[0] );
- #else
- status = curandGenerateUniformDouble(gen_, buffer_.dptr, buffer_.shape[0] );
- #endif
- utils::Assert(status == CURAND_STATUS_SUCCESS, "CURAND Gen Uniform failed\n");
- return expr::reshape( buffer_, shape );
- }
- private:
- /*! \brief random numbeer generator */
- curandGenerator_t gen_;
- /*! \brief templ buffer */
- TensorContainer<gpu, 1> buffer_;
- }; // class Random<gpu>
- #endif
-
-}; // namespace mshadow
-
-#endif // MSHADOW_TENSOR_RANDOM_H
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/mshadow/tensor_sse-inl.hpp
----------------------------------------------------------------------
diff --git a/include/mshadow/tensor_sse-inl.hpp b/include/mshadow/tensor_sse-inl.hpp
deleted file mode 100644
index b98383e..0000000
--- a/include/mshadow/tensor_sse-inl.hpp
+++ /dev/null
@@ -1,431 +0,0 @@
-#ifndef MSHADOW_TENSOR_SSE_INL_HPP
-#define MSHADOW_TENSOR_SSE_INL_HPP
-/*!
- * \file tensor_sse-inl.hpp
- * \brief support of sse2 optimization of some operations
- * \author Tianqi Chen
- */
-#ifdef __APPLE__
-#include <stdlib.h>
-#else
-#include <malloc.h>
-#endif
-
-#include "tensor_expr.h"
-#include "tensor.h"
-
-namespace mshadow {
- /*! \brief namespace to support sse2 vectorization */
- namespace sse2{
- /*!
- * \brief analog to cudaMallocPitch, allocate a aligned space with num_line * lspace cells
- * \param pitch output parameter, the actuall space allocated for each line
- * \param lspace number of cells required for each line
- * \param num_line number of lines to be allocated
- */
- inline void* AlignedMallocPitch( size_t &pitch, size_t lspace, size_t num_line ){
- pitch = ((lspace+15) >> 4) << 4;
- #ifdef _MSC_VER
- void * res = _aligned_malloc( pitch*num_line, 16 );
- #else
- #ifdef __APPLE__
- void *res = malloc( pitch * num_line );
- #else
- void * res = memalign( 16, pitch*num_line );
- #endif
- #endif
- utils::Assert( res != NULL, "AlignedMallocPitch failed" );
- return res;
- }
- /*!
- * \brief free aligned space
- * \param ptr pointer to space to be freed
- */
- inline void AlignedFree( void *ptr ){
- #ifdef _MSC_VER
- _aligned_free( ptr );
- #else
- free( ptr );
- #endif
- }
- /*! \brief check if a pointer is aligned */
- inline bool CheckAlign( size_t pitch ){
- return !(pitch & ((1<<4)-1));
- }
- /*! \brief check if a pointer is aligned */
- inline bool CheckAlign( void *ptr ){
- return CheckAlign( (size_t)ptr );
- }
- /*!
- * \brief get upper bound of aligned index of size
- * \param size size of the array
- * \param fsize size of float
- */
- inline index_t UpperAlign( index_t size, size_t fsize ){
- return (( (size*fsize+15) >> 4 ) << 4) / fsize;
- }
- /*!
- * \brief get lower bound of aligned index of size
- * \param size size of the array
- * \param fsize size of float
- */
- inline index_t LowerAlign( index_t size, size_t fsize ){
- return (( (size*fsize) >> 4 ) << 4) / fsize;
- }
- }; // namespace sse2
-}; // namespace mshadow
-
-#if MSHADOW_USE_SSE
-// sse types are not compatible with nvcc, only use them in cpu mode
-#include <emmintrin.h>
-
-namespace mshadow{
- namespace sse2{
- /*!
- * \brief float vector real type, used for vectorization
- * \tparam FloatType double or float
- */
- template<typename FloatType> struct FVec{};
-
- /*! \brief vector real type for float */
- template<>
- struct FVec<float> {
- public:
- typedef __m128 DType;
- /*! \brief number of float in vector */
- const static index_t kSize = 4;
- /*! \brief data content */
- DType data_;
- public:
- /* constructors */
- FVec( void ){}
- FVec( DType data ):data_(data){}
- /* set the float */
- FVec( const float &s ){
- data_ = _mm_set1_ps( s );
- }
- /*!\brief load from pointer src */
- FVec( const float *src ){
- data_ = _mm_load_ps( src );
- }
- public:
- /*! \brief store data into dst space */
- inline void Store( float *dst ) const{
- return _mm_store_ps( dst, data_ );
- }
- /*! \brief sum of all content */
- inline float Sum( void ) const{
- DType ans = _mm_add_ps( data_, _mm_movehl_ps( data_, data_ ) );
- DType rst = _mm_add_ss( ans, _mm_shuffle_ps( ans, ans, 1 ) );
- #if defined(_MSC_VER) && ( _MSC_VER <= 1500 ) && defined(_WIN64)
- return rst.m128_f32[ 0 ];
- #else
- float rr = _mm_cvtss_f32( rst ) ;
- return rr;
- #endif
- }
- };
-
- /*! \brief vector real type for float */
- template<>
- struct FVec<double> {
- public:
- typedef __m128d DType;
- /*! \brief number of float in vector */
- const static index_t kSize = 2;
- /*! \brief data content */
- DType data_;
- public:
- /* constructors */
- FVec( void ){}
- FVec( DType data ):data_(data){}
- /* set the float */
- FVec( const double &s ){
- data_ = _mm_set1_pd( s );
- }
- /*!\brief load from pointer src */
- FVec( const double *src ){
- data_ = _mm_load_pd( src );
- }
- public:
- /*! \brief store data into dst space */
- inline void Store( double *dst ) const{
- return _mm_store_pd( dst, data_ );
- }
- /*! \brief sum of all content */
- inline double Sum( void ) const{
- DType tmp = _mm_add_sd( data_, _mm_unpackhi_pd( data_,data_ ) ) ;
- #if defined(_MSC_VER) && ( _MSC_VER <= 1500 ) && defined(_WIN64)
- return tmp.m128d_f64[0];
- #else
- double ans = _mm_cvtsd_f64( tmp );
- return ans;
- #endif
- }
- };
- };
-
- namespace sse2{
- /*! \brief sse2 operator type of certain operator */
- template<typename OP>
- struct SSEOp{
- const static bool kEnabled = false;
- };
- template<>
- struct SSEOp<op::plus>{
- const static bool kEnabled = true;
- MSHADOW_CINLINE static FVec<float> Map( const FVec<float> &lhs, const FVec<float> &rhs ){
- return FVec<float>( _mm_add_ps( lhs.data_, rhs.data_ ) );
- }
- MSHADOW_CINLINE static FVec<double> Map( const FVec<double> &lhs, const FVec<double> &rhs ){
- return FVec<double>( _mm_add_pd( lhs.data_, rhs.data_ ) );
- }
- };
- template<>
- struct SSEOp<op::minus>{
- const static bool kEnabled = true;
- MSHADOW_CINLINE static FVec<float> Map( const FVec<float> &lhs, const FVec<float> &rhs ){
- return FVec<float>( _mm_sub_ps( lhs.data_, rhs.data_ ) );
- }
- MSHADOW_CINLINE static FVec<double> Map( const FVec<double> &lhs, const FVec<double> &rhs ){
- return FVec<double>( _mm_sub_pd( lhs.data_, rhs.data_ ) );
- }
- };
- template<>
- struct SSEOp<op::mul>{
- const static bool kEnabled = true;
- MSHADOW_CINLINE static FVec<float> Map( const FVec<float> &lhs, const FVec<float> &rhs ){
- return FVec<float>( _mm_mul_ps( lhs.data_, rhs.data_ ) );
- }
- MSHADOW_CINLINE static FVec<double> Map( const FVec<double> &lhs, const FVec<double> &rhs ){
- return FVec<double>( _mm_mul_pd( lhs.data_, rhs.data_ ) );
- }
- };
- template<>
- struct SSEOp<op::div>{
- const static bool kEnabled = true;
- MSHADOW_CINLINE static FVec<float> Map( const FVec<float> &lhs, const FVec<float> &rhs ){
- return FVec<float>( _mm_div_ps( lhs.data_, rhs.data_ ) );
- }
- MSHADOW_CINLINE static FVec<double> Map( const FVec<double> &lhs, const FVec<double> &rhs ){
- return FVec<double>( _mm_div_pd( lhs.data_, rhs.data_ ) );
- }
- };
-
- template<>
- struct SSEOp<op::identity>{
- const static bool kEnabled = true;
- MSHADOW_CINLINE static FVec<float> Map( const FVec<float> &src ){
- return src;
- }
- MSHADOW_CINLINE static FVec<double> Map( const FVec<double> &src ){
- return src;
- }
- };
- }; // namespace sse2
-
- namespace sse2{
- // savers to do storage
- template<typename SV, typename TFloat>
- struct Saver{
- MSHADOW_CINLINE static void Save( TFloat *dst, const FVec<TFloat> &src ){
- FVec<TFloat> lhs( dst );
- FVec<TFloat> ans = SSEOp<typename SV::OPType>::Map( lhs, src );
- ans.Store( dst );
- }
- };
- template<typename TFloat>
- struct Saver<sv::saveto,TFloat>{
- MSHADOW_CINLINE static void Save( TFloat *dst, const FVec<TFloat> &src ){
- src.Store( dst );
- }
- };
- }; // namespace sse2
-}; // namespace mshadow
-
-namespace mshadow{
- namespace expr{
- // same as plan, but use sse2
- template<typename ExpType>
- class SSEPlan {
- public:
- /*!
- * \brief evaluate the expression at index [y][x], x will be aligned to 4
- * to be implemented by SubType
- */
- MSHADOW_CINLINE sse2::FVec<real_t> EvalSSE( index_t y, index_t x ) const;
- MSHADOW_CINLINE real_t Eval( index_t y, index_t x ) const;
- };
-
- template <typename Device, int dim>
- class SSEPlan< Tensor<Device,dim> >{
- public:
- SSEPlan( const Tensor<Device,dim> &t )
- :dptr_(t.dptr),stride_(t.shape.stride_){}
- MSHADOW_CINLINE sse2::FVec<real_t> EvalSSE( index_t y, index_t x ) const{
- return sse2::FVec<real_t>( &dptr_[ y*stride_+x ] );
- }
- MSHADOW_CINLINE real_t Eval( index_t y, index_t x ) const{
- return dptr_[ y * stride_ + x ];
- }
- private:
- const real_t *dptr_;
- index_t stride_;
- };
-
- template<>
- class SSEPlan<ScalarExp>{
- public:
- SSEPlan( real_t scalar ):scalar_(scalar){}
- MSHADOW_CINLINE sse2::FVec<real_t> EvalSSE( index_t y, index_t x ) const{
- return sse2::FVec<real_t>( scalar_ );
- }
- MSHADOW_CINLINE real_t Eval( index_t y, index_t x ) const{
- return scalar_;
- }
- private:
- real_t scalar_;
- };
-
- template<typename OP, typename TA, typename TB,int etype>
- class SSEPlan< BinaryMapExp<OP,TA,TB,etype> >{
- public:
- SSEPlan( const SSEPlan<TA> &lhs, const SSEPlan<TB> &rhs )
- :lhs_(lhs), rhs_(rhs){}
- MSHADOW_CINLINE sse2::FVec<real_t> EvalSSE( index_t y, index_t x ) const{
- return sse2::SSEOp<OP>::Map( lhs_.EvalSSE( y, x ), rhs_.EvalSSE( y, x ) );
- }
- MSHADOW_CINLINE real_t Eval( index_t y, index_t x ) const{
- return OP::Map( lhs_.Eval( y, x ), rhs_.Eval( y, x ) );
- }
- private:
- SSEPlan<TA> lhs_;
- SSEPlan<TB> rhs_;
- };
-
- template<typename OP, typename TA, int etype>
- class SSEPlan< UnaryMapExp<OP,TA,etype> >{
- public:
- SSEPlan( const SSEPlan<TA> &src ):src_(src){}
- MSHADOW_CINLINE sse2::FVec<real_t> EvalSSE( index_t y, index_t x ) const{
- return sse2::SSEOp<OP>::Map( src_.EvalSSE( y, x ) );
- }
- MSHADOW_CINLINE real_t Eval( index_t y, index_t x ) const{
- return OP::Map( src_.Eval( y, x ) );
- }
- private:
- SSEPlan<TA> src_;
- };
-
- template<typename OP, typename TA, typename TB, int etype>
- inline SSEPlan< BinaryMapExp<OP,TA,TB,etype> > MakeSSEPlan( const BinaryMapExp<OP,TA,TB,etype> &e );
-
- inline SSEPlan<ScalarExp> MakeSSEPlan( const ScalarExp &e ){
- return SSEPlan<ScalarExp>( e.scalar_ );
- }
-
- template<typename T>
- inline SSEPlan<T> MakeSSEPlan( const ContainerExp<T> &e ){
- return SSEPlan<T>( e.self() );
- }
-
- template<typename T,int dim>
- inline SSEPlan<T> MakeSSEPlan( const MakeTensorExp<T,cpu,dim> &e ){
- return SSEPlan<T>( e.real_self() );
- }
-
- template<typename OP, typename TA, int etype>
- inline SSEPlan< UnaryMapExp<OP,TA,etype> > MakeSSEPlan( const UnaryMapExp<OP,TA,etype> &e ){
- return SSEPlan< UnaryMapExp<OP,TA,etype> >( MakeSSEPlan(e.src_) );
- }
-
- template<typename OP, typename TA, typename TB, int etype>
- inline SSEPlan< BinaryMapExp<OP,TA,TB,etype> > MakeSSEPlan( const BinaryMapExp<OP,TA,TB,etype> &e ){
- return SSEPlan< BinaryMapExp<OP,TA,TB,etype> >( MakeSSEPlan(e.lhs_), MakeSSEPlan(e.rhs_) );
- }
- };
-
- namespace expr{
- /*!
- * \brief static check sse enable
- * if a expression E can not be evaluated using sse, then kPass = false
- * \tparam Device the type of Device
- * \tparam dim dimension of the tensor
- * \tparam E expression
- */
- template<typename E>
- struct SSECheck{
- const static bool kPass = false;
- };
- template<>
- struct SSECheck<ScalarExp>{
- const static bool kPass = true;
- };
- template<int dim>
- struct SSECheck<Tensor<cpu,dim> >{
- const static bool kPass = true;
- };
-
- template<typename OP, typename TA, int etype>
- struct SSECheck<UnaryMapExp<OP,TA,etype> >{
- const static bool kPass = SSECheck<TA>::kPass && sse2::SSEOp<OP>::kEnabled;
- };
- template<typename OP, typename TA, typename TB, int etype>
- struct SSECheck< BinaryMapExp<OP,TA,TB,etype> >{
- const static bool kPass = SSECheck<TA>::kPass && SSECheck<TB>::kPass && sse2::SSEOp<OP>::kEnabled;
- };
- }; // namespace expr
- namespace expr{
- // check if data is aligned and allow sse operation
- template<int dim,typename E>
- struct SSEAlignCheck{
- inline static bool Check( const E &exp ){
- return false;
- }
- };
- template<int dim>
- struct SSEAlignCheck< dim, ScalarExp >{
- inline static bool Check( const ScalarExp &exp ){
- return true;
- }
- };
- template<int dim>
- struct SSEAlignCheck< dim,Tensor<cpu,dim> >{
- inline static bool Check( const Tensor<cpu,dim> &t ){
- return sse2::CheckAlign( t.dptr ) && sse2::CheckAlign( t.shape.stride_ * sizeof( real_t ) );
- }
- };
- template<int dim, typename OP, typename TA, int etype>
- struct SSEAlignCheck< dim, UnaryMapExp<OP,TA,etype> >{
- inline static bool Check( const UnaryMapExp<OP,TA,etype> &t ){
- return SSEAlignCheck<dim,TA>::Check( t.src_);
- }
- };
- template<int dim, typename OP, typename TA, typename TB, int etype>
- struct SSEAlignCheck< dim, BinaryMapExp<OP,TA,TB,etype> >{
- inline static bool Check( const BinaryMapExp<OP,TA,TB,etype> &t ){
- return SSEAlignCheck<dim,TA>::Check( t.lhs_ ) &&
- SSEAlignCheck<dim,TB>::Check( t.rhs_ );
- }
- };
- }; // namespace expr
-
- /*!
- * \brief use SSEPlan to compute result
- */
- template<typename SV, typename E, int dim>
- inline void MapSSEPlan(Tensor<cpu,dim> _dst, const expr::SSEPlan<E> &plan){
- Tensor<cpu,2> dst = _dst.FlatTo2D();
- const index_t xlen = sse2::LowerAlign( dst.shape[0], sizeof(real_t) );
- for ( index_t y = 0; y < dst.shape[1]; y ++ ) {
- for( index_t x = 0; x < xlen; x += sse2::FVec<real_t>::kSize ){
- sse2::Saver<SV,real_t>::Save( &dst[y][x], plan.EvalSSE( y,x ) );
- }
- for( index_t x = xlen; x < dst.shape[0]; x ++ ){
- SV::Save( dst[y][x], plan.Eval(y,x) );
- }
- }
- }
-}; // namespace mshadow
-#endif // MSHADOW_USE_SSE
-#endif // MSHADOW_TENSOR_SSE_INL_HPP
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/comm/msg.h
----------------------------------------------------------------------
diff --git a/include/singa/comm/msg.h b/include/singa/comm/msg.h
deleted file mode 100644
index 8e03cd5..0000000
--- a/include/singa/comm/msg.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_COMM_MSG_H_
-#define SINGA_COMM_MSG_H_
-
-#include <utility>
-
-// TODO(wangwei): make it a compiler argument
-// #define USE_ZMQ
-
-#include <vector>
-#ifdef USE_ZMQ
-#include <czmq.h>
-#endif
-
-namespace singa {
-/**
- * Wrapper to generate message address
- * @param grp worker/server group id
- * @param id_or_proc worker/server id or procs id
- * @param type msg type
- */
-inline int Addr(int grp, int id_or_proc, int type) {
- return (grp << 16) | (id_or_proc << 8) | type;
-}
-
-/**
- * Parse group id from addr.
- *
- * @return group id
- */
-inline int AddrGrp(int addr) {
- return addr >> 16;
-}
-
-/**
- * Parse worker/server id from addr.
- *
- * @return id
- */
-inline int AddrID(int addr) {
- static const int mask = (1 << 8) - 1;
- return (addr >> 8) & mask;
-}
-
-/**
- * Parse worker/server procs from addr.
- *
- * @return procs id
- */
-inline int AddrProc(int addr) {
- return AddrID(addr);
-}
-
-/**
- * Parse msg type from addr
- * @return msg type
- */
-inline int AddrType(int addr) {
- static const int mask = (1 << 8) -1;
- return addr & mask;
-}
-
-/**
- * Msg used to transfer Param info (gradient or value), feature blob, etc.
- * between workers, stubs and servers.
- *
- * Each msg has a source addr and dest addr identified by a unique integer.
- * It is also associated with a target field (value and version) for ease of
- * getting some meta info (e.g., parameter id) from the msg.
- *
- * Other data is added into the message as frames.
- */
-class Msg {
- public:
- ~Msg();
- Msg();
- /**
- * Construct the msg providing source and destination addr.
- */
- Msg(int src, int dst);
- /**
- * Copy constructor.
- */
- Msg(const Msg& msg);
- /**
- * Swap the src/dst addr
- */
- void SwapAddr();
- /**
- * Add a frame (a chunck of bytes) into the message
- */
- void AddFrame(const void* addr, int nBytes);
- /**
- * @return num of bytes of the current frame.
- */
- int FrameSize();
- /**
- * @return the pointer to the current frame data.
- */
- void* FrameData();
- /**
- * @return the data of the current frame as c string
- */
- char* FrameStr();
- /**
- * Move the cursor to the first frame.
- */
- void FirstFrame();
- /**
- * Move the cursor to the last frame.
- */
- void LastFrame();
- /**
- * Move the cursor to the next frame
- * @return true if the next frame is not NULL; otherwise false
- */
- bool NextFrame();
- /**
- * Add a 'format' frame to the msg (like CZMQ's zsock_send).
- *
- * The format is a string that defines the type of each field.
- * The format can contain any of these characters, each corresponding to
- * one or two arguments:
- * i = int (signed)
- * 1 = uint8_t
- * 2 = uint16_t
- * 4 = uint32_t
- * 8 = uint64_t
- * p = void * (sends the pointer value, only meaningful over inproc)
- * s = char**
- *
- * Returns size of the added content.
- */
- int AddFormatFrame(const char *format, ...);
- /**
- * Parse the current frame added using AddFormatFrame(const char*, ...).
- *
- * The format is a string that defines the type of each field.
- * The format can contain any of these characters, each corresponding to
- * one or two arguments:
- * i = int (signed)
- * 1 = uint8_t
- * 2 = uint16_t
- * 4 = uint32_t
- * 8 = uint64_t
- * p = void * (sends the pointer value, only meaningful over inproc)
- * s = char**
- *
- * Returns size of the parsed content.
- */
- int ParseFormatFrame(const char* format, ...);
-
-#ifdef USE_ZMQ
- void ParseFromZmsg(zmsg_t* msg);
- zmsg_t* DumpToZmsg();
-#endif
-
- /**
- * @return msg size in terms of bytes, ignore meta info.
- */
- int size() const;
- /**
- * Set source addr.
- * @param addr unique identify one worker/server/stub in the current job
- */
- inline void set_src(int addr) { src_ = addr; }
- /**
- * @return source addr.
- */
- inline int src() const { return src_; }
- /**
- * Set destination addr.
- * @param addr unique identify one worker/server/stub in the current job
- */
- inline void set_dst(int addr) { dst_ = addr; }
- /**
- * @return dst addr.
- */
- inline int dst() const { return dst_; }
- /**
- * Set msg type, e.g., kPut, kGet, kUpdate, kRequest
- */
- inline void set_type(int type) { type_ = type; }
- /**
- * @return msg type.
- */
- inline int type() const { return type_; }
- /**
- * Set msg target.
- *
- * One msg has a target to identify some entity in worker/server/stub.
- * The target is associated with a version, e.g., Param version.
- */
- inline void set_trgt(int val, int version) {
- trgt_val_ = val;
- trgt_version_ = version;
- }
- inline int trgt_val() const { return trgt_val_; }
- inline int trgt_version() const { return trgt_version_; }
-
- protected:
- int src_ = 0;
- int dst_ = 0;
- int type_ = 0;
- int trgt_val_ = 0;
- int trgt_version_ = 0;
-#ifdef USE_ZMQ
- zmsg_t* msg_ = nullptr;
- zframe_t *frame_ = nullptr;
-#else
- std::vector<std::pair<void*, int>> frames_;
- unsigned idx_ = 0;
-#endif
-};
-
-inline void DeleteMsg(Msg** msg) {
- delete *msg;
- *msg = nullptr;
-}
-
-} // namespace singa
-
-#endif // SINGA_COMM_MSG_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/comm/socket.h
----------------------------------------------------------------------
diff --git a/include/singa/comm/socket.h b/include/singa/comm/socket.h
deleted file mode 100644
index 40d4cc3..0000000
--- a/include/singa/comm/socket.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_COMM_SOCKET_H_
-#define SINGA_COMM_SOCKET_H_
-
-#ifdef USE_ZMQ
-#include <czmq.h>
-#endif
-
-#include <map>
-#include <string>
-#include <vector>
-#include <unordered_map>
-#include "singa/utils/safe_queue.h"
-#include "singa/comm/msg.h"
-
-namespace singa {
-/**
- * Worker and Server use Dealer to communicate with Stub.
- * Stub uses Dealer to communicate with remote Stub.
- */
-class Dealer {
- public:
- /**
- * @param id used for identifying the msg queue of this dealer.
- */
- explicit Dealer(int id);
- ~Dealer();
- /**
- * Setup the connection with the remote router.
- *
- * For local router, there is no need to connect it.
- *
- * @param endpoint Identifier of the remote router to connect. It follows
- * ZeroMQ's format, i.e., IP:port, where IP is the connected process.
- * @return 1 connection sets up successfully; 0 otherwise
- */
- int Connect(const std::string& endpoint);
- /**
- * Send a message to the local router (id=-1) or remote outer. It is
- * non-blocking. The message will be deallocated after sending, thus
- * should not be used after calling Send();
- */
- int Send(Msg** msg);
- /**
- * Recv msg from local router.
- *
- * @param timeout return if waiting for timeout microseconds.
- * @return a message pointer if success; nullptr if failure
- */
- Msg* Receive(int timeout = 0);
-
- protected:
- std::string endpoint_;
- int id_;
-#ifdef USE_ZMQ
- zsock_t* dealer_ = nullptr;
-#endif
-};
-/**
- * In Singa, since each process has one router used by Stub, hence we fix the
- * router to use the msg queue indexed by -1.
- */
-class Router {
- public:
- ~Router();
- Router();
- /**
- * Bind the router to an endpoint for recv msg from remote dealer.
- * If the router is used for intra-communication only, then no need to call
- * Bind.
- *
- * @param endpoint identifier for the Dealer socket in other process
- * to connect. It has the format IP:Port, where IP is the host machine.
- * @return number of connected dealers.
- */
- int Bind(const std::string& endpoint);
- /**
- * Send msg to local dealers by pushing the msg into the msg queue indexed by
- * dst of the msg.
- */
- int Send(Msg** msg);
- /**
- * Recv msg from local (msg queue) or remote dealer (via zmq).
- */
- Msg* Receive(int timeout = 0);
-
- protected:
- std::string endpoint_;
-#ifdef USE_ZMQ
- zsock_t* router_ = nullptr;
- zpoller_t* poller_ = nullptr;
-#endif
-};
-
-/**
- * Used for intra-process communication.
- * Each dealer/router has a SafeQueue for recieving msgs.
- * The sender pushes msgs onto the queue of the reciever's queue.
- */
-extern std::unordered_map<int, SafeQueue<Msg*>> msgQueues;
-} // namespace singa
-
-#endif // SINGA_COMM_SOCKET_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/core/device.h
----------------------------------------------------------------------
diff --git a/include/singa/core/device.h b/include/singa/core/device.h
new file mode 100644
index 0000000..ef7c208
--- /dev/null
+++ b/include/singa/core/device.h
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+
+
+namespace singa {
+
+/// Allocate memory for Tensor objects and execute Tensor operations.
+class Device {
+
+
+
+
+};
+
+} /* singa */
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/core/memory.h
----------------------------------------------------------------------
diff --git a/include/singa/core/memory.h b/include/singa/core/memory.h
new file mode 100644
index 0000000..0a7aa82
--- /dev/null
+++ b/include/singa/core/memory.h
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+
+
+namespace singa {
+
+/// Manage device memory pool including garbage collection, memory opt.
+class VirtualMemory {
+
+
+
+
+};
+
+} /* singa */
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/core/scheduler.h
----------------------------------------------------------------------
diff --git a/include/singa/core/scheduler.h b/include/singa/core/scheduler.h
new file mode 100644
index 0000000..6071b33
--- /dev/null
+++ b/include/singa/core/scheduler.h
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+
+
+namespace singa {
+
+/// Scheduling Tensor operations with dependency detection.
+class Scheduler {
+
+
+
+
+};
+
+} /* singa */
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/core/tensor.h
----------------------------------------------------------------------
diff --git a/include/singa/core/tensor.h b/include/singa/core/tensor.h
new file mode 100644
index 0000000..795891d
--- /dev/null
+++ b/include/singa/core/tensor.h
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+
+
+namespace singa {
+
+/// A multi-dimensional array resident on a device.
+class Tensor {
+
+
+
+
+};
+
+} /* singa */
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/driver.h
----------------------------------------------------------------------
diff --git a/include/singa/driver.h b/include/singa/driver.h
deleted file mode 100644
index 0105158..0000000
--- a/include/singa/driver.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-#ifndef SINGA_DRIVER_H_
-#define SINGA_DRIVER_H_
-
-#include <vector>
-#include <string>
-#include "singa/proto/job.pb.h"
-#include "singa/proto/singa.pb.h"
-#include "singa/utils/factory.h"
-#include "singa/utils/param.h"
-#include "singa/utils/singleton.h"
-#include "singa/utils/updater.h"
-#include "singa/neuralnet/layer.h"
-#include "singa/worker.h"
-#include "singa/server.h"
-
-namespace singa {
-using std::vector;
-class Driver {
- public:
- /**
- * Init SINGA
- * - init glog
- * - parse job id and job conf from cmd line
- * - register built-in layer, worker, updater, param subclasses.
- *
- * May be used for MPI init if it is used for message passing.
- */
- void Init(int argc, char** argv);
- /**
- * Init SINGA LOG
- * Used for python binding. Users can also directly call it as a C++ API.
- * - init glog with given parameters
- *
- */
- void InitLog(char *arg);
- /**
- * Update job configuration and call Train(const JobProto&) to start the
- * training.
- *
- * It sets up the logging path and checkpoing files (if resume), and checks
- * the existence of the workspace folder .
- *
- * @param[in] resume if true resume the training from the latest checkpoint
- * files.
- * @param[in] job_conf job configuration.
- */
- void Train(bool resume, const JobProto& job_conf);
- /**
- * Used for python binding. Users can also directly call it as a C++ API.
- *
- * It completes the functions as defined above but accept serialized string
- * parameters.
- *
- * @param[in] resume if true resume the training from the latest checkpoint
- * files.
- * @param[in] str serialized string recorded job configuration.
- */
- void Train(bool resume, const std::string str);
- /**
- * Create workers and servers to conduct the training.
- *
- * @param[in] job_conf job configuration with all necessary fields set (e.g.,
- * by Train(bool, const JobProto&).
- */
- void Train(const JobProto& job_conf);
- /**
- * Test the pre-trained model by loading parameters from checkpoint files.
- *
- * It can be used for both computing accuracy of test data, and extracting
- * features (predicting label) of new data.
- * @param[in] job_conf job configuration, which should include the checkpoint
- * files and test settings (e.g., test steps). To extract features, the output
- * layers should be added.
- */
- void Test(const JobProto& job_conf);
- /**
- * Used for python binding. Users can also directly call it as a C++ API.
- *
- * It completes the functions as defined above but accept serialized string
- * parameters.
- *
- * @param[in] str serialized string recorded job configuration.
- */
- void Test(const std::string str);
- /**
- * Setting the checkpoint field of the job configuration to resume training.
- *
- * The checkpoint folder will be searched to get the files for the latest
- * checkpoint, which will be added into the checkpoint field. The workers
- * would then load the values of params from the checkpoint files.
- *
- * @param job_conf job configuration
- */
- void SetupForResume(JobProto* job_conf);
- /**
- * Create server instances.
- *
- * @param[in] job_conf job configuration.
- * @param[in] net training neural network.
- * @return server instances
- */
- const vector<Server*> CreateServers(const JobProto& job_conf, NeuralNet* net);
- /**
- * Create workers instances.
- * @param[in] job_conf job configuration.
- * @param[in] net training neural network.
- * @return worker instances
- */
- const vector<Worker*> CreateWorkers(const JobProto& job_conf, NeuralNet* net);
-
-
- /*********** Subclasses registers *************************/
- /**
- * Register a Layer subclass.
- *
- * @param type layer type ID. If called to register built-in subclasses,
- * it is from LayerType; if called to register user-defined
- * subclass, it is a string;
- * @return 0 if success; otherwise -1.
- */
- template<typename Subclass, typename Type>
- int RegisterLayer(const Type& type);
- /**
- * Register an Updater subclass.
- *
- * @param type ID of the subclass. If called to register built-in subclasses,
- * it is from UpdaterType; if called to register user-defined
- * subclass, it is a string;
- * @return 0 if success; otherwise -1.
- */
- template<typename Subclass, typename Type>
- int RegisterUpdater(const Type& type);
- /**
- * Register a learning rate generator subclasses.
- *
- * @param type ID of the subclass. If called to register built-in subclasses,
- * it is from ChangeMethod; if called to register user-defined
- * subclass, it is a string;
- * @return 0 if success; otherwise -1.
- */
- template<typename Subclass, typename Type>
- int RegisterLRGenerator(const Type& type);
- /**
- * Register a Worker subclass.
- *
- * @param type ID of the subclass. If called to register built-in subclasses,
- * it is from TrainOneBatchAlg; if called to register user-defined
- * subclass, it is a string;
- * @return 0 if success; otherwise -1.
- */
- template<typename Subclass, typename Type>
- int RegisterWorker(const Type& type);
- /**
- * Register a Param subclass.
- * @param type ID of the subclass. If called to register built-in subclasses,
- * it is from ParamType; if called to register user-defined
- * subclass, it is a string;
- *
- * @return 0 if success; otherwise -1.
- */
- template<typename Subclass, typename Type>
- int RegisterParam(const Type& type);
- /**
- * Register ParamGenerator subclasses for initalizing Param objects.
- *
- * @param type ID of the subclass. If called to register built-in subclasses,
- * it is from InitMethod; if called to register user-defined
- * subclass, it is a string;
- * @return 0 if success; otherwise -1.
- */
- template<typename Subclass, typename Type>
- int RegisterParamGenerator(const Type& type);
-
- /****************** Access function ********************/
- /**
- * @return job ID which is generated by zookeeper and passed in by the
- * launching script.
- */
- inline int job_id() const { return job_id_; }
- /**
- * @return job conf path which is passed by users at the command line. It
- * should at least contains the cluster configuration.
- */
- inline JobProto job_conf() const { return job_conf_; }
-
- private:
- int job_id_;
- std::string hostip_;
- JobProto job_conf_;
- SingaProto singa_conf_;
-};
-
-/************* Implementation of template functions*************************
-* Must put the implementation in driver.h file instead of driver.cc.
-* Otherwise there would be linking error caused by unknown registration
-* functions, becuase these function cannot be generated merely based on its
-* declearation in driver.h.
-*/
-
-template<typename Subclass, typename Type>
-int Driver::RegisterLayer(const Type& type) {
- auto factory = Singleton<Factory<singa::Layer>>::Instance();
- factory->Register(type, CreateInstance(Subclass, Layer));
- return 1;
-}
-
-template<typename Subclass, typename Type>
-int Driver::RegisterParam(const Type& type) {
- auto factory = Singleton<Factory<singa::Param>>::Instance();
- factory->Register(type, CreateInstance(Subclass, Param));
- return 1;
-}
-
-template<typename Subclass, typename Type>
-int Driver::RegisterParamGenerator(const Type& type) {
- auto factory = Singleton<Factory<singa::ParamGenerator>>::Instance();
- factory->Register(type, CreateInstance(Subclass, ParamGenerator));
- return 1;
-}
-
-template<typename Subclass, typename Type>
-int Driver::RegisterUpdater(const Type& type) {
- auto factory = Singleton<Factory<singa::Updater>>::Instance();
- factory->Register(type, CreateInstance(Subclass, Updater));
- return 1;
-}
-
-template<typename Subclass, typename Type>
-int Driver::RegisterLRGenerator(const Type& type) {
- auto factory = Singleton<Factory<singa::LRGenerator>>::Instance();
- factory->Register(type, CreateInstance(Subclass, LRGenerator));
- return 1;
-}
-
-template<typename Subclass, typename Type>
-int Driver::RegisterWorker(const Type& type) {
- auto factory = Singleton<Factory<singa::Worker>>::Instance();
- factory->Register(type, CreateInstance(Subclass, Worker));
- return 1;
-}
-
-} // namespace singa
-
-#endif // SINGA_DRIVER_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/hdfs_store.h
----------------------------------------------------------------------
diff --git a/include/singa/io/hdfs_store.h b/include/singa/io/hdfs_store.h
deleted file mode 100644
index 1fb9258..0000000
--- a/include/singa/io/hdfs_store.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_IO_HDFS_STORE_H_
-#define SINGA_IO_HDFS_STORE_H_
-
-#include <string>
-#include "singa/io/store.h"
-#include "singa/io/hdfsfile.h"
-
-namespace singa {
-namespace io {
-
-/**
- * HDFS implementation of the Store interface. The store manages key-value
- * records storing in HDFS files.
- *
- * The store consists of records of the following format:
- * [<length><content>]
- */
-class HDFSStore : public Store {
- public:
- ~HDFSStore() { Close();}
- bool Open(const std::string& source, Mode mode) override;
- void Close() override;
- bool Read(std::string* key, std::string* value) override;
- void SeekToFirst() override;
- void Seek(int offset) override;
- bool Write(const std::string& key, const std::string& value) override;
- void Flush() override;
-
- private:
- HDFSFile* file_ = nullptr;
- Mode mode_;
-};
-
-} // namespace io
-} // namespace singa
-
-#endif // SINGA_IO_HDFS_STORE_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/hdfsfile.h
----------------------------------------------------------------------
diff --git a/include/singa/io/hdfsfile.h b/include/singa/io/hdfsfile.h
deleted file mode 100644
index cd3ded3..0000000
--- a/include/singa/io/hdfsfile.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_IO_HDFSFILE_H_
-#define SINGA_IO_HDFSFILE_H_
-
-#include <fstream>
-#include <string>
-#include <unordered_set>
-
-
-#define USE_PROTOBUF 1
-
-#ifdef USE_PROTOBUF
-#include <google/protobuf/message.h>
-#endif
-
-#include <hdfs/hdfs.h>
-
-namespace singa {
-namespace io {
-
-/**
- * HDFSFile represents a specific partition of the HDFS file storing training/validation
- * or test data. HDFS library maintains its own buffer, so we don't need one.
- *
- * Each record is of the form: <length><content>
- */
-class HDFSFile {
- public:
- enum Mode {
- // read only mode used in training
- kRead = 0,
- // write mode used in creating HDFSFile (will overwrite previous one)
- kCreate = 1,
- // append mode, e.g. used when previous creating crashes
- kAppend = 2
- };
-
- /**
- * HDFSFile constructor.
- *
- * @param path path to file, of the form "hdfs://namenode/file_path"
- * @param mode HDFSFile::kRead, HDFSFile::kCreate or HDFSFile::kAppend
- */
- HDFSFile(const std::string& path, Mode mode);
- ~HDFSFile();
-
-#ifdef USE_PROTOBUF
- /**
- * read next tuple from the HDFSFile.
- *
- * @param val Record of type Message
- * @return false if read unsuccess, e.g., the tuple was not inserted
- * completely.
- */
- bool Next(google::protobuf::Message* val);
- /**
- * Append one record to the HDFSFile.
- *
- * @param val
- * @return false if unsucess, e.g., inserted before
- */
- bool Insert(const google::protobuf::Message& tuple);
-#endif
-
- /**
- * Read next record from the HDFSFile.
- *
- * @param val Record of type string
- * @return false if unsuccess, e.g. the tuple was not inserted completely.
- */
- bool Next(std::string* val);
- /**
- * Append record to the KVFile.
- *
- * @param key e.g., image path
- * @param val
- * @return false if unsucess, e.g., inserted before
- */
- bool Insert(const std::string& tuple);
- /**
- * Move the read pointer to the head of the KVFile file.
- * Used for repeated reading.
- */
- void Seek(int offset);
-
- /**
- * Flush buffered data to disk.
- * Used only for kCreate or kAppend.
- */
- void Flush();
- /**
- * @return path to HDFSFile file
- */
- inline std::string path() { return path_; }
-
- private:
- std::string path_ = "";
- Mode mode_;
- // handle to HDFS
- hdfsFS fs_;
- // handle to the HDFS open file
- hdfsFile file_;
-
- //!< to avoid replicated record
- std::unordered_set<std::string> keys_;
-};
-} // namespace io
-
-} // namespace singa
-
-#endif // SINGA_IO_HDFSFILE_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/imagefolder_store.h
----------------------------------------------------------------------
diff --git a/include/singa/io/imagefolder_store.h b/include/singa/io/imagefolder_store.h
deleted file mode 100644
index c05d92d..0000000
--- a/include/singa/io/imagefolder_store.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-// TODO(wangwei) store images in a disk folder
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/kvfile.h
----------------------------------------------------------------------
diff --git a/include/singa/io/kvfile.h b/include/singa/io/kvfile.h
deleted file mode 100644
index 6d9a709..0000000
--- a/include/singa/io/kvfile.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_IO_KVFILE_H_
-#define SINGA_IO_KVFILE_H_
-
-#include <fstream>
-#include <string>
-#include <unordered_set>
-
-#define USE_PROTOBUF 1
-
-#ifdef USE_PROTOBUF
-#include <google/protobuf/message.h>
-#endif
-
-namespace singa {
-namespace io {
-
-/**
- * KVFile stores training/validation/test tuples.
- * Every worker node should have a KVFile for training data (validation/test
- * KVFile is optional).
- * KVFile consists of a set of unordered tuples. Each tuple is
- * encoded as [key_len key val_len val] (key_len and val_len are of type
- * uint32, which indicate the bytes of key and value respectively.
- *
- * When KVFile is created, it will remove the last tuple if the value size
- * and key size do not match because the last write crashed.
- *
- * TODO(wangwei) split one KVFile into multiple KVFile s.
- *
- */
-class KVFile {
- public:
- enum Mode {
- // read only mode used in training
- kRead = 0,
- // write mode used in creating KVFile (will overwrite previous one)
- kCreate = 1,
- // append mode, e.g. used when previous creating crashes
- kAppend = 2
- };
-
- /**
- * KVFile constructor.
- *
- * @param path path to the disk KVFile, it can be
- * - a path to local disk file.
- * - a path to local directory. This is to be compatible with the older
- * version (DataShard). The KVFile is shard.dat under that directory
- * - a hdfs file starting with "hdfs://"
- * @param mode KVFile open mode, KVFile::kRead, KVFile::kWrite or
- * KVFile::kAppend
- * @param bufsize Cache bufsize bytes data for every disk op (read or write),
- * default is 10MB.
- */
- KVFile(const std::string& path, Mode mode, int bufsize = 10485760);
- ~KVFile();
-
-#ifdef USE_PROTOBUF
- /**
- * read next tuple from the KVFile.
- *
- * @param key Tuple key
- * @param val Record of type Message
- * @return false if read unsuccess, e.g., the tuple was not inserted
- * completely.
- */
- bool Next(std::string* key, google::protobuf::Message* val);
- /**
- * Append one tuple to the KVFile.
- *
- * @param key e.g., image path
- * @param val
- * @return false if unsucess, e.g., inserted before
- */
- bool Insert(const std::string& key, const google::protobuf::Message& tuple);
-#endif
- /**
- * read next tuple from the KVFile.
- *
- * @param key Tuple key
- * @param val Record of type string
- * @return false if unsuccess, e.g. the tuple was not inserted completely.
- */
- bool Next(std::string* key, std::string* val);
- /**
- * Append one tuple to the KVFile.
- *
- * @param key e.g., image path
- * @param val
- * @return false if unsucess, e.g., inserted before
- */
- bool Insert(const std::string& key, const std::string& tuple);
- /**
- * Move the read pointer to the head of the KVFile file.
- * Used for repeated reading.
- */
- void SeekToFirst();
- /**
- * Flush buffered data to disk.
- * Used only for kCreate or kAppend.
- */
- void Flush();
- /**
- * Iterate through all tuples to get the num of all tuples.
- *
- * @return num of tuples
- */
- int Count();
- /**
- * @return path to KVFile file
- */
- inline std::string path() { return path_; }
-
- protected:
- /**
- * Read the next key and prepare buffer for reading value.
- *
- * @param key
- * @return length (i.e., bytes) of value field.
- */
- int Next(std::string* key);
- /**
- * Setup the disk pointer to the right position for append in case that
- * the pervious write crashes.
- *
- * @param path KVFile path.
- * @return offset (end pos) of the last success written record.
- */
- int PrepareForAppend(const std::string& path);
- /**
- * Read data from disk if the current data in the buffer is not a full field.
- *
- * @param size size of the next field.
- */
- bool PrepareNextField(int size);
-
- private:
- std::string path_ = "";
- Mode mode_;
- //!< either ifstream or ofstream
- std::fstream fdat_;
- //!< to avoid replicated record
- std::unordered_set<std::string> keys_;
- //!< internal buffer
- char* buf_ = nullptr;
- //!< offset inside the buf_
- int offset_ = 0;
- //!< allocated bytes for the buf_
- int capacity_ = 0;
- //!< bytes in buf_, used in reading
- int bufsize_ = 0;
-};
-} // namespace io
-
-/**
- * @deprecated {ShardData is deprecated! Use KVFile}.
- */
-using DataShard = io::KVFile;
-} // namespace singa
-
-#endif // SINGA_IO_KVFILE_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/kvfile_store.h
----------------------------------------------------------------------
diff --git a/include/singa/io/kvfile_store.h b/include/singa/io/kvfile_store.h
deleted file mode 100644
index 50b8f4f..0000000
--- a/include/singa/io/kvfile_store.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_IO_KVFILE_STORE_H_
-#define SINGA_IO_KVFILE_STORE_H_
-
-#include <string>
-#include "singa/io/store.h"
-#include "singa/io/kvfile.h"
-
-namespace singa {
-namespace io {
-
-/**
- * Use the KVFile as the data storage.
- *
- * KVFile is a binary file. Each tuple is stored as byte string.
- */
-class KVFileStore : public Store {
- public:
- ~KVFileStore() { Close();}
- bool Open(const std::string& source, Mode mode) override;
- void Close() override;
- bool Read(std::string* key, std::string* value) override;
- void SeekToFirst() override;
- void Seek(int offset) override;
- bool Write(const std::string& key, const std::string& value) override;
- void Flush() override;
-
- private:
- KVFile* file_ = nullptr;
- Mode mode_;
-};
-
-} // namespace io
-} // namespace singa
-
-#endif // SINGA_IO_KVFILE_STORE_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/store.h
----------------------------------------------------------------------
diff --git a/include/singa/io/store.h b/include/singa/io/store.h
deleted file mode 100644
index a63a981..0000000
--- a/include/singa/io/store.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_IO_STORE_H_
-#define SINGA_IO_STORE_H_
-
-#include <string>
-
-namespace singa {
-namespace io {
-
-using std::string;
-enum Mode { kCreate, kRead, kAppend };
-
-/**
- * General key-value store that provides functions for reading and writing
- * tuples.
- *
- * Subclasses implement the functions for a specific data storage, e.g., CSV
- * file, HDFS, image folder, singa::io::SFile, leveldb, lmdb, etc.
- */
-class Store {
- public:
- Store() { }
- /**
- * In case that users forget to call Close() to release resources, e.g.,
- * memory, you can release them here.
- */
- virtual ~Store() { }
- /**
- * @param[in] source path to the storage, could be a file path, folder path
- * or hdfs path, or even a http url.
- * @param[in] mode
- * @return true if open successfully, otherwise false.
- */
- virtual bool Open(const std::string& source, Mode mode) = 0;
- /**
- * Release resources.
- */
- virtual void Close() = 0;
- /**
- * Read a tuple.
- *
- * @param[out] key
- * @param[out] value
- * @return true if read successfully, otherwise false.
- */
- virtual bool Read(std::string* key, std::string* value) = 0;
- /**
- * Seek the read header to the first tuple.
- */
- virtual void SeekToFirst() = 0;
-
- /**
- * Seek to an offset. This allows concurrent workers to start reading from
- * different positions (HDFS).
- */
- virtual void Seek(int offset) = 0;
- /**
- * Write a tuple.
- *
- * @param[in] key
- * @param[in] value
- * @return true if success, otherwise false.
- */
- virtual bool Write(const std::string& key, const std::string& value) = 0;
- /**
- * Flush writing buffer if it has.
- */
- virtual void Flush() {}
-};
-
-/**
- * Create a Store object.
- *
- * @param[in] backend identifier for a specific backend. Two backends are
- * inluced currently, i.e., "kvfile", "textfile"
- * @return a pointer to the newly created Store.
- */
-Store* CreateStore(const string& backend);
-/**
- * Create and open a Store object.
- *
- * @param[in] backend, @see CreateStore().
- * @param[in] path
- * @param[in] mode kRead or kCreate or kAppend
- */
-Store* OpenStore(const string& backend, const string& path, Mode mode);
-
-} // namespace io
-} // namespace singa
-
-#endif // SINGA_IO_STORE_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/io/textfile_store.h
----------------------------------------------------------------------
diff --git a/include/singa/io/textfile_store.h b/include/singa/io/textfile_store.h
deleted file mode 100644
index 83bcbfa..0000000
--- a/include/singa/io/textfile_store.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_IO_TEXTFILE_STORE_H_
-#define SINGA_IO_TEXTFILE_STORE_H_
-
-#include <fstream>
-#include <string>
-#include "singa/io/store.h"
-
-namespace singa {
-namespace io {
-/**
- * Use text file as the data storage, one line per tuple.
- *
- * It is used for storeing CSV format data where the key is the line No. and
- * the value is the line.
- */
-class TextFileStore : public Store {
- public:
- ~TextFileStore() { Close(); }
- bool Open(const std::string& source, Mode mode) override;
- void Close() override;
- bool Read(std::string* key, std::string* value) override;
- void SeekToFirst() override;
- void Seek(int offset) override;
- bool Write(const std::string& key, const std::string& value) override;
- void Flush() override;
-
- private:
- int lineNo_ = 0;
- std::fstream* fs_ = nullptr;
- Mode mode_;
-};
-
-} // namespace io
-} // namespace singa
-
-#endif // SINGA_IO_TEXTFILE_STORE_H_
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/layer/conv.h
----------------------------------------------------------------------
diff --git a/include/singa/layer/conv.h b/include/singa/layer/conv.h
new file mode 100644
index 0000000..fd43018
--- /dev/null
+++ b/include/singa/layer/conv.h
@@ -0,0 +1,29 @@
+/**
+ * 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.
+ */
+
+
+namespace singa {
+
+class ConvLayer {
+
+
+
+
+};
+
+} /* singa */
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/model/rnn.h
----------------------------------------------------------------------
diff --git a/include/singa/model/rnn.h b/include/singa/model/rnn.h
new file mode 100644
index 0000000..7d2c20c
--- /dev/null
+++ b/include/singa/model/rnn.h
@@ -0,0 +1,29 @@
+/**
+ * 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.
+ */
+
+
+namespace singa {
+
+class RNN {
+
+
+
+
+};
+
+} /* singa */
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/dd1e4afa/include/singa/neuralnet/connection_layer.h
----------------------------------------------------------------------
diff --git a/include/singa/neuralnet/connection_layer.h b/include/singa/neuralnet/connection_layer.h
deleted file mode 100644
index 481d991..0000000
--- a/include/singa/neuralnet/connection_layer.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/************************************************************
-*
-* 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.
-*
-*************************************************************/
-
-#ifndef SINGA_NEURALNET_CONNECTION_LAYER_H_
-#define SINGA_NEURALNET_CONNECTION_LAYER_H_
-
-#include <string>
-#include <unordered_map>
-#include <vector>
-#include "singa/comm/socket.h"
-#include "singa/neuralnet/layer.h"
-
-namespace singa {
-/**
- * Used inside SplitLayer and SliceLayer to locate the out-going connection
- * index given the Layer pointer.
- */
-class Layer2Index {
- public:
- int Get(const Layer* layer) {
- if (layer2idx_.find(layer) == layer2idx_.end()) {
- int idx = layer2idx_.size();
- layer2idx_[layer] = idx;
- }
- return layer2idx_[layer];
- }
-
- private:
- std::unordered_map<const Layer*, int> layer2idx_;
-};
-
-
-class BridgeLayer : public ConnectionLayer {
- public:
- void set_ready(bool a) { ready_ = a; }
- bool ready() const { return ready_; }
- // Bind the layer with dealer instance by worker at runtime
- void MakePaired(Layer* pair, int grp_id, Dealer* dealer,
- std::unordered_map<std::string, Layer*>* name2bridge);
- // Send blobs to other workers due to model partitions
- void SendBlobs(bool handle_data);
- // Receive blobs from other workers due to model partitions;
- void ReceiveBlobs(bool handle_data);
-
- protected:
- //!< true if received grad from BridgeDstLayer
- bool ready_ = false;
- int group_id_ = 0;
- Layer* pair_ = nullptr;
- Dealer* dealer_ = nullptr;
- std::unordered_map<std::string, Layer*>* name2bridge_ = nullptr;
-};
-
-/**
- * For sending data to layer on other threads which may resident on other nodes
- * due to layer/data partition.
- */
-class BridgeSrcLayer : public BridgeLayer {
- public:
- void Setup(const LayerProto& conf, const vector<Layer*>& srclayers) override;
- void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
- void ComputeGradient(int flag, const vector<Layer*>& srclayers) override;
-};
-
-/**
- * For recv data from layer on other threads which may resident on other nodes
- * due to layer/data partiton
- */
-class BridgeDstLayer : public BridgeLayer {
- public:
- void Setup(const LayerProto& conf, const vector<Layer*>& srclayers) override;
- void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
- void ComputeGradient(int flag, const vector<Layer*>& srclayers) override;
-};
-/**
- * Connect multiple (src) layers with a single (dst) layer.
- *
- * It concates feature Blobs (i.e., matrix) of src layers on one dimension.
- * The concated feature Blob will be fed into the dst layer.
- */
-class ConcateLayer : public ConnectionLayer {
- public:
- void Setup(const LayerProto& proto, const vector<Layer*>& srclayers) override;
- void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
- void ComputeGradient(int flag, const vector<Layer*>& srclayers) override;
-
- private:
- int num_concates_ = 0;
- int concate_dim_ = 0;
-};
-
-/**
- * Connect a single (src) layer with multiple (dst) layers.
- *
- * It slices the feature Blob (i.e., matrix) of the src layer on one dimension.
- * The sliced feature Blobs will be fed into dst layers.
- */
-class SliceLayer : public ConnectionLayer {
- public:
- ~SliceLayer();
- void Setup(const LayerProto& proto, const vector<Layer*>& srclayers) override;
- void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
- void ComputeGradient(int flag, const vector<Layer*>& srclayers) override;
- const std::string ToString(bool debug, int flag) override;
- const Blob<float>& data(const Layer* from) override;
- const Blob<float>& grad(const Layer* from) override;
- Blob<float>* mutable_data(const Layer* from) override;
- Blob<float>* mutable_grad(const Layer* from) override;
-
- private:
- int num_slices_ = 0;
- int slice_dim_ = 0;
- Layer2Index layer_idx_;
-};
-
-/**
- * Connect a single (src) layer with multiple dst layers.
- *
- * It replicates the feature Blob of the src layer.
- * Each replicated feature Blob will be fed into one dst layer.
- * It aggregates gradients set by all dst layers and set it to the src layer.
- */
-class SplitLayer : public ConnectionLayer {
- public:
- ~SplitLayer();
- void Setup(const LayerProto& proto, const vector<Layer*>& srclayers) override;
- void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
- void ComputeGradient(int flag, const vector<Layer*>& srclayers) override;
- const std::string ToString(bool debug, int flag) override;
- const Blob<float>& grad(const Layer* from) override;
- Blob<float>* mutable_grad(const Layer* from) override;
-
- private:
- int num_splits_ = 0;
- Layer2Index layer_idx_;
-};
-
-/**
- * Dummy layer for RNN models, which provides input for other layers.
- *
- * Particularly, it is used in the test phase of RNN models to connect other
- * layers and avoid cycles in the neural net config.
- */
-class RNNDummyLayer : public ConnectionLayer {
- public:
- void Setup(const LayerProto& proto, const vector<Layer*>& srclayers) override;
- void ComputeFeature(int flag, const vector<Layer*>& srclayers) override;
- void ComputeGradient(int flag, const vector<Layer*>& srclayers) {
- LOG(FATAL) << "Not implemented";
- }
-
- const string srclayer(int step) const {
- if (step > 0)
- return dynamic_src_;
- else
- return "";
- }
-
- private:
- string dynamic_src_;
- float low_, high_;
- bool integer_;
- Layer* srclayer_;
-};
-
-
-} // namespace singa
-
-#endif // SINGA_NEURALNET_CONNECTION_LAYER_H_