in src/models.py [0:0]
def forward(self, x, score_rhs=True, score_rel=False, score_lhs=False):
lhs = self.embeddings[0](x[:, 0])
rel = self.embeddings[1](x[:, 1])
rhs = self.embeddings[0](x[:, 2])
lhs = lhs[:, :self.rank], lhs[:, self.rank:]
rel = rel[:, :self.rank], rel[:, self.rank:]
rhs = rhs[:, :self.rank], rhs[:, self.rank:]
rhs_scores, rel_scores = None, None
if score_rhs:
to_score_entity = self.embeddings[0].weight
to_score_entity = to_score_entity[:, :self.rank], to_score_entity[:, self.rank:]
rhs_scores = (
(lhs[0] * rel[0] - lhs[1] * rel[1]) @ to_score_entity[0].transpose(0, 1) +
(lhs[0] * rel[1] + lhs[1] * rel[0]) @ to_score_entity[1].transpose(0, 1)
)
if score_rel:
to_score_rel = self.embeddings[1].weight
to_score_rel = to_score_rel[:, :self.rank], to_score_rel[:, self.rank:]
rel_scores = (
(lhs[0] * rhs[0] + lhs[1] * rhs[1]) @ to_score_rel[0].transpose(0, 1) +
(lhs[0] * rhs[1] - lhs[1] * rhs[0]) @ to_score_rel[1].transpose(0, 1)
)
if score_lhs:
to_score_lhs = self.embeddings[0].weight
to_score_lhs = to_score_lhs[:, :self.rank], to_score_lhs[:, self.rank:]
lhs_scores = (
(rel[0] * rhs[0] + rel[1] * rhs[1]) @ to_score_lhs[0].transpose(0, 1) +
(rel[0] * rhs[1] - rel[1] * rhs[0]) @ to_score_lhs[1].transpose(0, 1)
)
factors = self.get_factor(x)
if score_rhs and score_rel and score_lhs:
return (rhs_scores, rel_scores, lhs_scores), factors
elif score_rhs and score_rel:
return (rhs_scores, rel_scores), factors
elif score_lhs and score_rel:
pass
elif score_rhs and score_lhs:
pass
elif score_rhs:
return rhs_scores, factors
elif score_rel:
return rel_scores, factors
elif score_lhs:
return lhs_scores, factors
else:
return None