def __next__(self): """Get next batch Returns ------- DGLGraph Sampled positive graph ChunkNegEdgeSubgraph Negative graph wrapper """ while True: pos_g, neg_g = next(self.sampler_iter) if self.filter_false_neg: neg_positive = neg_g.edata['false_neg'] neg_g = create_neg_subgraph(pos_g, neg_g, self.neg_chunk_size, self.neg_sample_size, 'chunk' in self.mode, self.neg_head, self.g.number_of_nodes()) if neg_g is not None: break pos_g.ndata['id'] = pos_g.parent_nid neg_g.ndata['id'] = neg_g.parent_nid pos_g.edata['id'] = pos_g._parent.edata['tid'][pos_g.parent_eid] if self.filter_false_neg: neg_g.edata['bias'] = F.astype(-neg_positive, F.float32) return pos_g, neg_g
def __next__(self): while True: pos_g, neg_g = next(self.sampler_iter) neg_positive = neg_g.edata['false_neg'] neg_g = create_neg_subgraph(pos_g, neg_g, 'PBG' in self.mode, self.neg_head, self.g.number_of_nodes()) if neg_g is not None: break pos_g.copy_from_parent() neg_g.copy_from_parent() neg_g.edata['bias'] = F.astype(-neg_positive, F.float32) return pos_g, neg_g
def edge_sparsemax(graph: dgl.DGLGraph, logits, eids=ALL, norm_by="dst"): r""" Description ----------- Compute edge sparsemax. For a node :math:`i`, edge sparsemax is an operation that computes .. math:: a_{ij} = \text{ReLU}(z_{ij} - \tau(\z_{i,:})) where :math:`z_{ij}` is a signal of edge :math:`j\rightarrow i`, also called logits in the context of sparsemax. :math:`\tau` is a function that can be found at the `From Softmax to Sparsemax <https://arxiv.org/pdf/1602.02068.pdf>` paper. NOTE: currently only homogeneous graphs are supported. Parameters ---------- graph : DGLGraph The graph to perform edge sparsemax on. logits : torch.Tensor The input edge feature. eids : torch.Tensor or ALL, optional A tensor of edge index on which to apply edge sparsemax. If ALL, apply edge sparsemax on all edges in the graph. Default: ALL. norm_by : str, could be 'src' or 'dst' Normalized by source nodes of destination nodes. Default: `dst`. Returns ------- Tensor Sparsemax value. """ # we get edge index tensors here since it is # hard to get edge index with HeteroGraphIndex # object without other information like edge_type. row, col = graph.all_edges(order="eid") assert norm_by in ["dst", "src"] end_n_ids = col if norm_by == "dst" else row if not is_all(eids): eids = astype(eids, graph.idtype) end_n_ids = end_n_ids[eids] return EdgeSparsemaxFunction.apply(graph._graph, logits, eids, end_n_ids, norm_by)