Repository: pykeen/pykeen
Issue: NodePiece: The use of `complex_normalize` as a `relation_constrainer` results in relation embeddings that only have the value of 1 or -1. 
Root cause: Validation Gap

### Describe the bug

When using the example NodePiece code suggested in the tutorial page, the use of `complex_normalize` results in relation embeddings that all either have the value 1 or -1. 

This seems to be because the `complex_normalize` function is actually expecting a complex tensor in order to work. I couldn't see a clear way to set the `dtype` arg for the relation representations within NodePiece.

Not sure if this is expected or if some changes need to be made to the NodePiece docs or with `complex_normalize` itself. 

### How to reproduce

Running the following:
```python 
from pykeen.models import NodePiece
from pykeen.pipeline import pipeline

result = pipeline(
    dataset="nations",
    dataset_kwargs=dict(
        create_inverse_triples=True,
    ),
    model=NodePiece,
    model_kwargs=dict(
        tokenizers=["RelationTokenizer"],
        num_tokens=[12],
        interaction="rotate",
        relation_constrainer="complex_normalize"
    ),
)
result.model.relation_representations[0](indices=None)
```
Will result in:
```
tensor([ 1.,  1.,  1.,  1., -1.,  1.,  1.,  1., -1.,  1., -1., -1., -1.,  1.,
         1., -1., -1., -1.,  1.,  1., -1.,  1., -1., -1., -1., -1., -1.,  1.,
        -1., -1., -1.,  1.,  1., -1., -1., -1., -1.,  1.,  1., -1.,  1.,  1.,
        -1., -1., -1.,  1.,  1., -1., -1.,  1.,  1.,  1.,  1., -1.,  1.,  1.,
        -1., -1., -1.,  1.,  1., -1.,  1., -1.], grad_fn=<SelectBackward0>)
```

Indeed we can see this would be the behaviour when `complex_normalize` is provided with anything but a complex tensor:

```python
from pykeen.datasets import Nations
from pykeen.models import ERModel
from pykeen.pipeline import pipeline

dataset = Nations()
model = ERModel(
    triples_factory=dataset.training,
    interaction='complex',
    entity_representations_kwargs=dict(embedding_dim=10),
    relation_representations_kwargs=dict(embedding_dim=10, constrainer="complex_normalize"),
)
result = pipeline(
    dataset=dataset,
    model=model,

)
result.model.relation_representations[0](indices=None)[0]
```
```
tensor([-1.,  1., -1., -1.,  1., -1.,  1.,  1.,  1.,  1.],
       grad_fn=<SelectBackward0>)
```

This behaviour can also been seen just using the function itself:
```python 
import torch
from pykeen.utils import complex_normalize

x = torch.randn(1, 5)
print(complex_normalize(x))

x = torch.complex(torch.rand(1, 5), torch.rand(1, 5))
print(complex_normalize(x))
```

```
tensor([[-1., -1., -1., -1.,  1.]])
tensor([[0.7224+0.6915j, 0.5615+0.8275j, 0.7709+0.6370j, 0.7440+0.6682j,
         0.9029+0.4299j]])
```

### Environment

| Key             | Value                    |
|-----------------|--------------------------|
| OS              | posix                    |
| Platform        | Darwin                   |
| Release         | 22.5.0                   |
| Time            | Wed Jun 21 11:58:43 2023 |
| Python          | 3.9.12                   |
| PyKEEN          | 1.10.2-dev               |
| PyKEEN Hash     | UNHASHED                 |
| PyKEEN Branch   |                          |
| PyTorch         | 2.0.1                    |
| CUDA Available? | false                    |
| CUDA Version    | N/A                      |
| cuDNN Version   | N/A                      |

### Additional information

_No response_

### Issue Template Checks

- [X] This is not a feature request (use a different issue template if it is)
- [X] This is not a question (use the [discussions](https://github.com/pykeen/pykeen/discussions/new) forum instead)
- [X] I've read the text explaining why including environment information is important and understand if I omit this information that my issue will be dismissed

Hi @sbonner0 ,

I think this is caused by NodePiece using real embeddings despite selecting an interaction that is defined on complex tensors.

There is a dirty hotfix in #1288, but I think it would be better to fix that upstream, i.e., make sure that those representations are marked as complex when RotatE is selected (and let `complex_normalize` crash on non-complex input instead of silently failing).

Hi @mberr thanks so much for looking at this - the proposed fix seems like a good one for now.

@sbonner0 , the fix finally made it into `master` and will be included in the next release (soon).

Thanks so much for the fix @mberr - hope you are well!