def backward(self, values, gradients):
     x, y = self.args
     dfdx = self.dfdx(values[x], values[y], values[self])
     dfdy = self.dfdy(values[x], values[y], values[self])
     if x in gradients:
         gradients[x] += nphacks.contract_like(dfdx * gradients[self], values[x])
     if y in gradients:
         gradients[y] += nphacks.contract_like(dfdy * gradients[self], values[y])
 def backward(self, values, gradients):
     c, x, y = self.args
     if x in gradients:
         gradients[x] += nphacks.contract_like(c.astype(bool) * gradients[self], values[x])
     if y in gradients:
         gradients[y] += nphacks.contract_like(numpy.logical_not(c) * gradients[self], values[x])
 def backward(self, values, gradients):
     x, y = self.args
     if x in gradients:
         gradients[x] += nphacks.contract_like(gradients[self], values[x])
     if y in gradients:
         gradients[y] += nphacks.contract_like(gradients[self], values[y])
 def backward(self, values, gradients):
     x = self.args[0]
     dfdx = self.dfdx(values[x], values[self])
     if x in gradients:
         gradients[x] += nphacks.contract_like(dfdx * gradients[self], values[x])