dgl.softmax_edges(graph, feat, *, etype=None)[source]

Perform graph-wise softmax on the edge features.

For each edge \(e\in\mathcal{E}\) and its feature \(x_e\), calculate its normalized feature as follows:

\[z_e = \frac{\exp(x_e)}{\sum_{e'\in\mathcal{E}}\exp(x_{e'})}\]

If the graph is a batch of multiple graphs, each graph computes softmax independently. The result tensor has the same shape as the original edge feature.

  • graph (DGLGraph.) – The input graph.

  • feat (str) – The edge feature name.

  • etype (str or (str, str, str), optional) –

    The type names of the edges. The allowed type name formats are:

    • (str, str, str) for source node type, edge type and destination node type.

    • or one str edge type name if the name can uniquely identify a triplet format in the graph.

    Can be omitted if the graph has only one type of edges.


Result tensor.

Return type:



>>> import dgl
>>> import torch as th

Create two DGLGraph objects and initialize their edge features.

>>> g1 = dgl.graph(([0, 1], [1, 0]))              # Graph 1
>>> g1.edata['h'] = th.tensor([1., 1.])
>>> g2 = dgl.graph(([0, 1, 0], [1, 2, 2]))        # Graph 2
>>> g2.edata['h'] = th.tensor([1., 1., 1.])

Softmax over one graph:

>>> dgl.softmax_edges(g1, 'h')
tensor([.5000, .5000])

Softmax over a batched graph:

>>> bg = dgl.batch([g1, g2])
>>> dgl.softmax_edges(bg, 'h')
tensor([.5000, .5000, .3333, .3333, .3333])

See also