Random sample negative edges from graph, excluding self-loops, the result samples might be less than num_samples
(g, num_samples)
| 205 | |
| 206 | |
| 207 | def negative_sample(g, num_samples): |
| 208 | """Random sample negative edges from graph, excluding self-loops, |
| 209 | the result samples might be less than num_samples |
| 210 | """ |
| 211 | num_nodes = g.num_nodes() |
| 212 | redundancy = _calc_redundancy(num_samples, g.num_edges(), num_nodes**2) |
| 213 | sample_size = int(num_samples * (1 + redundancy)) |
| 214 | edges = np.random.randint(0, num_nodes, size=(2, sample_size)) |
| 215 | edges = np.unique(edges, axis=1) |
| 216 | # remove self loop |
| 217 | mask_self_loop = edges[0] == edges[1] |
| 218 | # remove existing edges |
| 219 | has_edges = F.asnumpy(g.has_edges_between(edges[0], edges[1])) |
| 220 | mask = ~(np.logical_or(mask_self_loop, has_edges)) |
| 221 | edges = edges[:, mask] |
| 222 | if edges.shape[1] >= num_samples: |
| 223 | edges = edges[:, :num_samples] |
| 224 | return edges |
| 225 | |
| 226 | |
| 227 | class AsLinkPredDataset(DGLDataset): |
no test coverage detected