def group_dg_grads()

in blocksparse/matmul.py [0:0]


def group_dg_grads(bsmm_dw_op, dw, scope):

    # splice the dg + addn ops out of the graph and replace with a single dg op
    # that takes in the final accumulated dw value
    dg_op  = bsmm_dw_op.outputs[0].consumers()[0]
    assert dg_op.type == "BlocksparseMatmulDG"
    dw, dg = blocksparse_matmul_dg(dw, *dg_op.inputs[1:], name=f"{scope}/BlocksparseMatmulDG")

    # splice old add_n op out of graph
    addn_op  = dg_op.outputs[1].consumers()[0]
    addn_ops = list()
    addn_ops.append(addn_op)
    if addn_op.type[0:3] != "Add":
        raise ValueError(f"bad type: {addn_ops[0].type} Cause: this segment does not share a broadcasted gate.")
    elif addn_op.type == "AddN8":
        while True:
            addn_op = addn_op.outputs[0].consumers()[0]
            if addn_op.type == "AddN8":
                addn_ops.append(addn_op)
            else:
                break

    # print(addn_op.name)
    # for i in addn_op.inputs:
    #     print(i.name)
    # print()
    addn = addn_ops[-1].outputs[0]
    dg_consumers = addn.consumers()
    #for op in dg_consumers:

    assert len(dg_consumers) > 0, "raw dg grad not supported"
    #print(addn.name)
    for dg_consumer in dg_consumers:
        found = False
        #print(dg_consumer.name)
        for i, t in enumerate(dg_consumer.inputs):
            #print(i, t.name)
            if t is addn:
                #print(f"splicing dg into: {dg_consumer.name} at {i}")
                dg_consumer._update_input(i, dg)
                found = True
                break
        if not found:
            print(f"splice failed for {dg_consumer.name}")
    return dw