| 1271 | self.M = M |
| 1272 | |
| 1273 | def forward(self, pos, neg): |
| 1274 | # L = max{0, M - fn(pos) + fn(neg)} |
| 1275 | zero = singa.Tensor(list(pos.shape()), pos.device()) |
| 1276 | zero.SetFloatValue(0.0) |
| 1277 | val = singa.AddFloat(singa.__sub__(neg, pos), self.M) |
| 1278 | gt_zero = singa.__gt__(val, zero) |
| 1279 | if training: |
| 1280 | self.inputs = (gt_zero,) # (BS,) |
| 1281 | all_loss = singa.__mul__(gt_zero, val) |
| 1282 | loss = singa.SumAll(all_loss) |
| 1283 | loss /= (pos.shape()[0]) |
| 1284 | return loss |
| 1285 | |
| 1286 | def backward(self, dy=1.0): |
| 1287 | assert training, "enable training mode to do backward" |