+function DAG:computeGradInput(gradInputSucc)
+ local gi
+ if #gradInputSucc == 1 then
+ gi = gradInputSucc[1] -- we avoid a clone()
+ elseif #gradInputSucc > 1 then
+ for k = 1, #gradInputSucc do
+ if gi then
+ gi:add(gradInputSucc[k])
+ else
+ gi = gradInputSucc[k]:clone()
+ end
+ end
+ end
+ return gi
+end
+
+function DAG:updateGradInput(input, gradOutput)
+ self:putInOrder()
+
+ self:nestedApply(
+ function(nnm, go) nnm:updateGradInput(self.node[nnm].input, go) end,
+ self.outputModules, gradOutput
+ )
+
+ self:nestedApply(
+ function(nnm, i) self.node[nnm].input = i end,
+ self.inputModules, input
+ )