forked from byungsook/deep-fluids
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata.py
73 lines (59 loc) · 2.46 KB
/
data.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
import os
from glob import glob
import numpy as np
import torch
from torch.utils.data import Dataset
class FluidDataset(Dataset):
def __init__(self, dir):
self.dir = dir
print(f"\033[32m[*] Loading the dataset from {self.dir}...")
# Read data generation arguments.
self.args = {}
print(os.path.join(self.dir, 'args.txt'))
with open(os.path.join(self.dir, 'args.txt'), 'r') as file:
while True:
line = file.readline()
if not line: break
key, value = line[:-1].split(': ')
self.args[key] = value
# Initialize meta data.
self.paths = sorted(glob(f"{self.dir}/v/*"))
self.cnt_p = int(self.args['num_param'])
self.res_x = int(self.args['resolution_x'])
self.res_y = int(self.args['resolution_y'])
print(f"[*] - {len(self.paths)} items. {self.cnt_p} parameters. {self.res_x}x{self.res_y}.")
# Set value ranges.
r = np.loadtxt(os.path.join(self.dir, 'v_range.txt'))
self.v_max = max(abs(r[0]), abs(r[1]))
print(f"[*] - v_max: {self.v_max}")
self.p_range = []
self.p_num = []
for i in range(self.cnt_p):
pi_name = self.args[f'p{i}']
pi_min = float(self.args[f'min_{pi_name}'])
pi_max = float(self.args[f'max_{pi_name}'])
pi_num = int(self.args[f'num_{pi_name}'])
print(f"[*] - {pi_name}, {pi_num} values, ranged in [{pi_min}, {pi_max}].")
self.p_range.append([pi_min, pi_max])
self.p_num.append(pi_num)
print("\033[0m", end="")
def __getitem__(self, index):
with np.load(self.paths[index]) as data:
v = torch.from_numpy(data['x']).float()
p = torch.from_numpy(data['y']).float()
# Normalize value to [-1, +1].
v /= self.v_max
for i, ri in enumerate(self.p_range):
p[i] = (p[i] - ri[0]) / (ri[1] - ri[0]) * 2 - 1
return p, v
def get_item_by_name(self, name):
with np.load(name) as data:
v = torch.from_numpy(data['x']).float()
p = torch.from_numpy(data['y']).float()
# Normalize value to [-1, +1].
v /= self.v_max
for i, ri in enumerate(self.p_range):
p[i] = (p[i] - ri[0]) / (ri[1] - ri[0]) * 2 - 1
return p, v
def __len__(self):
return len(self.paths)