(self, generators, out_base_name)
| 798 | 'input gradient.') |
| 799 | |
| 800 | def _MakeDenseSumOps(self, generators, out_base_name): |
| 801 | sum_op_input = [] |
| 802 | cnt = 0 |
| 803 | |
| 804 | assert len(generators) > 1 |
| 805 | |
| 806 | first_grad_op = True |
| 807 | for generator in generators: |
| 808 | grad_op, idx, g, _ = generator |
| 809 | assert(type(g) is not GradientSlice) |
| 810 | if grad_op: |
| 811 | if first_grad_op: |
| 812 | first_grad_op = False |
| 813 | out = grad_op.output[idx] |
| 814 | else: |
| 815 | out, cnt = self._DisambiguateGradOpOutput(grad_op, idx, cnt) |
| 816 | sum_op_input.append(out) |
| 817 | else: |
| 818 | self._CheckSumOpsConflict(out_base_name, g) |
| 819 | sum_op_input.append(str(g)) |
| 820 | |
| 821 | if out_base_name in sum_op_input: |
| 822 | # Sum inplace mode works only for the first input |
| 823 | # So we do a swap |
| 824 | idx = sum_op_input.index(out_base_name) |
| 825 | sum_op_input[0], sum_op_input[idx] = ( |
| 826 | sum_op_input[idx], sum_op_input[0] |
| 827 | ) |
| 828 | sum_ops = [CreateOperator( |
| 829 | "Sum", |
| 830 | [BlobReference(x) for x in sum_op_input], |
| 831 | BlobReference(out_base_name))] |
| 832 | return sum_ops, out_base_name |
| 833 | |
| 834 | def _MakeSparseSumOps(self, generators, out_base_name): |
| 835 | indices_concat_input = [] |
no test coverage detected