Remove the clone() for node.gradOutput when possible.
[dagnn.git] / README.md
index e18ea1f..206a132 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,7 +1,11 @@
 
-This package implements a new module nn.DAG which inherits from nn.Container and allows to combine modules in an arbitrary graph without cycle.
+#Introduction#
 
-#Example#
+This package implements a new module nn.DAG which inherits from
+nn.Container and allows to combine modules in an arbitrary graph
+without cycle.
+
+##Example##
 
 A typical use would be:
 
@@ -14,11 +18,11 @@ c = nn.Linear(10, 15)
 d = nn.CMulTable()
 e = nn.Linear(15, 15)
 
-model:addEdge(a, b)
-model:addEdge(b, nn.Linear(10, 15), nn.ReLU(), d)
-model:addEdge(b, c)
-model:addEdge(c, d)
-model:addEdge(c, nn.Mul(-1), e)
+model:connect(a, b)
+model:connect(b, nn.Linear(10, 15), nn.ReLU(), d)
+model:connect(b, c)
+model:connect(c, d)
+model:connect(c, nn.Mul(-1), e)
 
 model:setInput(a)
 model:setOutput({ d, e })
@@ -40,14 +44,73 @@ which would encode the following graph
 
 and run a forward pass with a random batch of 30 samples.
 
-Note that DAG:addEdge
+Note that DAG:connect allows to add a bunch of edges at once. This is
+particularly useful to add anonymous modules which have a single
+predecessor and successor.
+
+##Input and output##
+
+If a node has a single predecessor, its output is taken as-is. If it
+has multiple predecessors, all the outputs are collected into a table,
+and the table is used as input. The indexes of the outputs in that
+table reflects the order in which the predecessors appeared in the
+DAG:connect() commands.
+
+The input to the DAG (respectively the produced output) is a nested
+table of inputs reflecting the structure of the nested table of
+modules provided to DAG:setInput (respectively DAG:setOutput)
+
+So for instance, in the example above, the model expects a tensor as
+input, since it is the input to the module a, and its output will is a
+table composed of two tensors, corresponding to the outputs of d and e
+respectively.
+
+#Usage#
+
+##nn.DAG()##
+
+Create a new empty DAG, which inherits from nn.Container.
+
+##nn.DAG:connect([module1 [, module2 [, ...]]])##
+
+Add new nodes corresponding to the modules passed as arguments if they
+are not already existing. Add edges between every two nodes
+corresponding to a pair of successive modules in the arguments.
+
+##nn.DAG:setInput(i)##
+
+Defines the content and structure of the input. The argument should be
+either a module, or a (nested) table of module. The input to the DAG
+should be a (nested) table of inputs with the corresponding structure.
+
+##nn.DAG:setOutput(o)##
+
+Similar to DAG:setInput().
+
+##nn.DAG:print()##
+
+Prints the list of nodes.
+
+##nn.DAG:saveDot(filename)##
+
+Save a dot file to be used by the Graphviz set of tools for graph
+visualization. This dot file can than be used for instance to produce
+a pdf file with
+
+```
+dot graph.dot -T pdf -o graph.pdf
+```
+
+##nn.DAG:updateOutput(input)##
+
+See the torch documentation.
 
-#Input and output#
+##nn.DAG:updateGradInput(input, gradOutput)##
 
-If a node has a single successor, its output is sent unchanged as input to that successor. If it has multiple successors, the outputs are collected into a table, and the table is used as input to the successor node. The indexes of the outputs in that table reflects the order in which they appear in the addEdge commands.
+See the torch documentation.
 
-The expected input (respectively the produced output) is a nested table of inputs reflecting the structure of the nested table of modules provided to DAG:setInput (respectively DAG:setOutput)
+##nn.DAG:accGradParameters(input, gradOutput, scale)##
 
-So for instance, in the example above, the DAG expects a tensor as input, since it is the input to the module a, and its output will is a table composed of two tensors, corresponding to the outputs of e and f respectively.
+See the torch documentation.
 
-*Francois Fleuret, Jan 12th, 2017*
+*Francois Fleuret, Jan 13th, 2017*