# ComplExInteraction

class ComplExInteraction[source]

Bases: FunctionalInteraction[FloatTensor, FloatTensor, FloatTensor]

The ComplEx interaction proposed by [trouillon2016].

ComplEx operates on complex-valued entity and relation representations, i.e., $$\textbf{e}_i, \textbf{r}_i \in \mathbb{C}^d$$ and calculates the plausibility score via the Hadamard product:

$f(h,r,t) = Re(\mathbf{e}_h\odot\mathbf{r}_r\odot\bar{\mathbf{e}}_t)$

Which expands to:

$f(h,r,t) = \left\langle Re(\mathbf{e}_h),Re(\mathbf{r}_r),Re(\mathbf{e}_t)\right\rangle + \left\langle Im(\mathbf{e}_h),Re(\mathbf{r}_r),Im(\mathbf{e}_t)\right\rangle + \left\langle Re(\mathbf{e}_h),Im(\mathbf{r}_r),Im(\mathbf{e}_t)\right\rangle - \left\langle Im(\mathbf{e}_h),Im(\mathbf{r}_r),Re(\mathbf{e}_t)\right\rangle$

where $$Re(\textbf{x})$$ and $$Im(\textbf{x})$$ denote the real and imaginary parts of the complex valued vector $$\textbf{x}$$. Because the Hadamard product is not commutative in the complex space, ComplEx can model anti-symmetric relations in contrast to DistMult.

Official implementation: https://github.com/ttrouill/complex/

Note

this method generally expects all tensors to be of complex datatype, i.e., torch.is_complex(x) to evaluate to True. However, for backwards compatibility and convenience in use, you can also pass real tensors whose shape is compliant with torch.view_as_complex(), cf. pykeen.utils.ensure_complex().

Initializes internal Module state, shared by both nn.Module and ScriptModule.

Methods Summary

 func(h, r, t) Evaluate the interaction function.

Methods Documentation

static func(h, r, t)[source]

Evaluate the interaction function.

Parameters
• h (FloatTensor) – shape: (*batch_dims, dim) The complex head representations.

• r (FloatTensor) – shape: (*batch_dims, dim) The complex relation representations.

• t (FloatTensor) – shape: (*batch_dims, dim) The complex tail representations.

Return type

FloatTensor

Returns

shape: batch_dims The scores.