-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.py
101 lines (77 loc) · 2.86 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import datetime
import os
import os.path as osp
import random
import logging
from pathlib import Path
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import torch
from torch_geometric.utils import add_remaining_self_loops
def set_random_seed(seed=0):
random.seed(seed) # python
np.random.seed(seed) # numpy
torch.manual_seed(seed) # pytorch
if torch.cuda.is_available():
torch.cuda.manual_seed(seed) # pytorch-cuda
def get_date_postfix():
dt = datetime.datetime.now()
post_fix = '{}_{:02d}-{:02d}-{:02d}'.format(dt.date(), dt.hour, dt.minute, dt.second)
return post_fix
def get_n_params(model):
pp = 0
for p in list(model.parameters()):
nn = 1
for s in list(p.size()):
nn = nn * s
pp += nn
return pp
def set_logger(my_str):
task_time = get_date_postfix()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
Path(f"log/").mkdir(parents=True, exist_ok=True)
logger_name = f"{my_str}_{task_time}.log"
fh = logging.FileHandler(f"log/{logger_name}")
fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.WARN)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(ch)
return logger
def get_degree(edge_index):
s = pd.Series(edge_index.view(-1).numpy())
return s.value_counts().sort_index().values
def get_norm_degree(metapath_data, num_relations):
norm_degrees = []
for i in range(num_relations):
degree = get_degree(metapath_data[f'metapath_{i}'].edge_index)
norm_degree = MinMaxScaler(feature_range=(-1, 1)).fit_transform(degree.reshape(-1, 1))
norm_degrees.append(norm_degree)
norm_degrees = torch.from_numpy(np.stack(norm_degrees).squeeze(-1))
return norm_degrees
def add_self_loop(metapath_data, num_relations, num_nodes):
for i in range(num_relations):
new_edge_index, _ = add_remaining_self_loops(metapath_data[f'metapath_{i}'].edge_index, fill_value=1, num_nodes=num_nodes)
metapath_data[f'metapath_{i}'].edge_index = new_edge_index
return metapath_data
def idx2mask(idx):
mat = torch.eye(idx.shape[0], dtype=bool)
if idx.size == 0:
return mat
for row, col in enumerate(idx):
mat[row, col] = True
return mat
def get_masks(dataset_name, num_sem_pos=0, num_top_pos=0):
sem_pos_path = osp.join('pos', 'semantic', f'{dataset_name}.npy')
top_pos_path = osp.join('pos', 'topology', f'{dataset_name}.npy')
sem_pos = np.load(sem_pos_path)[:, :num_sem_pos]
top_pos = np.load(top_pos_path)[:, :num_top_pos]
sem_mask = idx2mask(sem_pos)
top_mask = idx2mask(top_pos)
return sem_mask, top_mask