--- /dev/null
+
+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#
+
+The typical use is:
+
+```Lua
+model = nn.DAG()
+
+a = nn.Linear(100, 10)
+b = nn.ReLU()
+c = nn.Linear(10, 15)
+d = nn.Linear(10, 15)
+e = nn.CMulTable()
+f = nn.Linear(15, 15)
+
+model:addEdge(a, b)
+model:addEdge(b, c)
+model:addEdge(b, d)
+model:addEdge(c, e)
+model:addEdge(d, e)
+model:addEdge(d, f)
+
+model:setInput(a)
+model:setOutput({ e, f })
+
+input = torch.Tensor(300, 100):uniform()
+output = model:updateOutput(input):clone()
+
+```
+
+which would encode the following graph
+
+ +--> c ----> e -->
+ / /
+ / /
+ input --> a --> b ----> d ---+ output
+ \
+ \
+ +--> f -->
+
+#Input and output#
+
+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.
+
+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)
+
+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.
+
+*Francois Fleuret, Jan 12th, 2017*