* add rnn op interfaces
* add Run
* rename state -> memory
* change state -> memory
* make compilable
* add .cc
* init test
* add op fake implementation
* add CreateStepNet and CreateScopes implementation.
* add TODO list
* init memory attributes.
* add LinkMemories
* add PlainNet fake implementation
* Use std::shared_ptr<Scope> in the OpRunContext.
* add test
* disable mutable_data
* finist segmentInput function
* enable mutable_data with a trick
* RNNOp test.
* enable LinkMemories with mutable_data
* update SegmentInput function with comments
* finish ConcatOutput function
* reformat inputs and attributes
boot_memories
* Refine unit test.
* Refine unit test.
* modify inlinks.
* add OpDesc to Net
* fix bug and update unit test.
* move step scopes from inputs to outputs
* fix merge conflict, update SegmentInput function
* add RecurrentOpProtoAndCheckerMaker.
* clean the codes
* Abstract GetStepScopes and GetMaxSeqLen function
* refine LinkMemories
* Refine code and add some comments.
* add backward core
* update for develop branch.
* add forward core
* add forward algorithm
* Add RecurrentGradientAlgorithm implenmention.
* use CopyFrom and Slice function in RecurrentOp
* add unit test for LinkMemories.
* fix unit test.
* use the latest tensor.h, solve conflict
* add maker
* move SegmentInput and ConcatOutput to details nameplace
* unit test for RecurrentGradientAlgorithm.
* apply OperatorBase
* apply net operator.
* move memorys to attributes
* add RecurrentGradientOp
* open test unit test in recurrent_network_op_test.
* revert some files.
* add RecurrentArgument and Link struct to simplify member variable.
* rename.
* move recurrent_op from framework to operators
* add RecurrentGradientOp Init
* fix name
* fix Link.interal/external name
* use namespace operators instead of framework
* clean the code
* use the latest add_op and mul_op, don't test backward now
* Remove ScopePtr and OperatorPtr
* add get_net to pybind
* add test_recurrent_op.py
* add random into gen_tensor
* update to develop branch and refine some code.
* add some comments.
* Expose Net to Python
* Expose PlainNet to Python, make python can add_op, complete_add_op
* Provide a low level api to manipulate Net
* Unittest for Net::DebugString
* Follow review comments to seperate Tensor Numpy interactive methods in
tensor.h.
* Simplify logic for `CastToPyBufferImpl`, make it as one struct and in
details namespace.
* Remove `Scope` expose in Python, since it currently is useless.
* Remove some debug functions.
All OpCreation method are generated by
`create_op_creation_methods::__bootstrap__` method, and stores in
`op_creations` object and its methods.
There are three parts to implement this feature.
1. Get all registered `OpProto` from C++ side. It is implemented in
`get_all_op_protos` method.
1. Create a function to convert `kwargs` to `OpDesc` base on each op's
`OpProto`. The `OpDescCreationMethod` class.
1. Convert `OpProto` to `docstring` by `get_docstring_from_op_proto`
method.
All three methods are unit tested. The `__bootstrap__` just combines
them together and create a method in runtime.
For details, please reference the doc string in
`create_op_creation_methods.py` and the unit test
`test_op_creation_methods.py`.
* PyBind and SWIG of paddle cannot be load in a single Python process,
lazy import all SWIG library of Paddle. Otherwise, the glog, gflags
are imported twice in a same Python process.
* Note that all PyBind11 return C++ std::string as an unicode. For
protobuf, it is need be cast to `str` before use them.
* Add unit test for Get `OpProtos`
`Paddle` manages Scope as programming language's scope. It just a
thread-local stack of Scope. Top of that stack is current scope, the
bottom of that stack is all scopes' parent.
Invoking `create_var/get_var` can `create/get` variable in current
scope. Invoking `enter_local_scope/leave_local_scope` can create or
destroy local scope.
A `scoped_function` will take a `function` as input. That function will
be invoked in a new local scope.
* Expose paddle.framework by pybind11
* Export paddle.framework.{Scope, Variable} to paddle.v2.framework.core.
* See python/paddle/v2/framework/tests/test_scope.py for Python usage
* See paddle/pybind/pybind.cc for C++ bind code.
* add copyright
Python should be able to manipulate Protobuf message because:
1. Python's `create_op_creation_methods` take the `OpProto` array to
generate all `op_creation_methods` in RunTime.
2. All `op_creation_methods` will create an `OpDesc` and pass it to
Paddle C++ method `CreateOp` and return the Op handle.
Here is the list of what is added in this commit:
* Add `protobuf_generate_python` if it is not defined.
* Before cmake 3.4, `protobuf_generate_python` is not defined. Just
copy the implementation of that function in `protobuf.cmake`
* Add `py_proto_compile` function in `cmake/generic.cmake`.
* It follows bazel's API interface.
* https://github.com/pubref/rules_protobuf#rules
* Add an empty package named `paddle.v2.framework`, all python code of
`paddle::framework` will be in that package.
* Generate protobuf's python module `__init__.py` by `touch` while
compiling.
* Change setup.py.in, make `paddle.v2.framework.proto` uses the
generated protobuf pythons.