import tensorlayerx as tlx
from gammagl.datasets import Planetoid
import numpy as np
from gammagl.layers.conv import MessagePassing
from gammagl.utils.softmax import segment_softmax
import tensorlayerx.nn as nn
from gammagl.layers.conv import HypergraphConv
# from gammagl.layers.conv import HypergraphConv
[docs]
class HCHA(tlx.nn.Module):
def __init__(self,
in_channels, out_channels, hidden_channels, ea_len, use_attention=False, heads=2,
concat=True, negative_slope=0.2, dropout=0.2, bias=True, num_layers = 2, name=None):
super().__init__(name=name)
# self.conv1 = HypergraphConv(in_channels, hidden_channels)
# self.conv2 = HypergraphConv(hidden_channels, out_channels)
if not use_attention:
heads = 1
self.num_layers = num_layers
if num_layers == 1:
self.conv = nn.ModuleList([HypergraphConv(in_channels, out_channels, ea_len,
heads=heads, use_attention=use_attention)])
else:
self.conv = nn.ModuleList([HypergraphConv(in_channels, hidden_channels, ea_len,
heads=heads, use_attention=use_attention)])
for _ in range(1, num_layers - 1):
self.conv.append(HypergraphConv(heads * hidden_channels, hidden_channels, ea_len,
heads=heads, use_attention=use_attention))
self.conv.append(HypergraphConv(heads * hidden_channels, out_channels, ea_len,
use_attention=use_attention))
# self.conv1 = GCNConv(feature_dim, hidden_dim, norm = 'both')
# self.conv2 = GCNConv(hidden_dim, num_class, norm = 'both')
self.relu = tlx.ReLU()
self.dropout = tlx.layers.Dropout(dropout)
[docs]
def forward(self,x, hyperedge_index,hyperedge_weight,hyperedge_attr=None):
# x = self.conv1(x, hyperedge_index, hyperedge_weight, hyperedge_attr)
# print('after conv1 out, x.shape:',x.shape)
# x = self.relu(x)
# x = self.dropout(x) # dropout not work in mindspore
# print('after drop out, x.shape:',x.shape)
# print('x.shape:',x.shape)
# print('hyperedge_index:',hyperedge_index.shape)
# print('hyperedge_weight.shape',hyperedge_weight.shape)
# print('hyperedge_attr.shape',hyperedge_attr.shape)
# x = self.conv2(x, hyperedge_index, hyperedge_weight, hyperedge_attr)
if self.num_layers == 1:
x = self.conv[0](x, hyperedge_index, hyperedge_weight, hyperedge_attr)
return x
for i in range(self.num_layers - 1):
x = self.conv[i](x, hyperedge_index, hyperedge_weight, hyperedge_attr)
x = self.relu(x)
x = self.dropout(x)
# print('x.shape:',x.shape)
# print('hyperedge_index:',hyperedge_index.shape)
# print('hyperedge_weight.shape',hyperedge_weight.shape)
# print('hyperedge_attr.shape',hyperedge_attr.shape)
x = self.conv[-1](x, hyperedge_index, hyperedge_weight, hyperedge_attr)
return x