IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.3KB

  1. #
  2. # Copyright (C) Stanislaw Adaszewski, 2020
  3. # License: GPLv3
  4. #
  5. from .layer import Layer
  6. import torch
  7. from typing import Union, \
  8. List
  9. from ..data import Data
  10. class InputLayer(Layer):
  11. def __init__(self, data: Data, output_dim: Union[int, List[int]]= None, **kwargs) -> None:
  12. output_dim = output_dim or \
  13. list(map(lambda a: a.count, data.node_types))
  14. if not isinstance(output_dim, list):
  15. output_dim = [output_dim,] * len(data.node_types)
  16. super().__init__(output_dim, is_sparse=False, **kwargs)
  17. self.data = data
  18. self.node_reps = None
  19. self.build()
  20. def build(self) -> None:
  21. self.node_reps = []
  22. for i, nt in enumerate(self.data.node_types):
  23. reps = torch.rand(nt.count, self.output_dim[i])
  24. reps = torch.nn.Parameter(reps)
  25. self.register_parameter('node_reps[%d]' % i, reps)
  26. self.node_reps.append(reps)
  27. def forward(self) -> List[torch.nn.Parameter]:
  28. return self.node_reps
  29. def __repr__(self) -> str:
  30. s = ''
  31. s += 'GNN input layer with output_dim: %s\n' % self.output_dim
  32. s += ' # of node types: %d\n' % len(self.data.node_types)
  33. for nt in self.data.node_types:
  34. s += ' - %s (%d)\n' % (nt.name, nt.count)
  35. return s.strip()
  36. class OneHotInputLayer(Layer):
  37. def __init__(self, data: Data, **kwargs) -> None:
  38. output_dim = [ a.count for a in data.node_types ]
  39. super().__init__(output_dim, is_sparse=True, **kwargs)
  40. self.data = data
  41. self.node_reps = None
  42. self.build()
  43. def build(self) -> None:
  44. self.node_reps = []
  45. for i, nt in enumerate(self.data.node_types):
  46. reps = torch.eye(nt.count).to_sparse()
  47. reps = torch.nn.Parameter(reps)
  48. self.register_parameter('node_reps[%d]' % i, reps)
  49. self.node_reps.append(reps)
  50. def forward(self) -> List[torch.nn.Parameter]:
  51. return self.node_reps
  52. def __repr__(self) -> str:
  53. s = ''
  54. s += 'One-hot GNN input layer\n'
  55. s += ' # of node types: %d\n' % len(self.data.node_types)
  56. for nt in self.data.node_types:
  57. s += ' - %s (%d)\n' % (nt.name, nt.count)
  58. return s.strip()