mirror of
https://github.com/Findus23/collision-analyisis-and-interpolation.git
synced 2024-09-19 15:13:50 +02:00
improve network
This commit is contained in:
parent
0021906370
commit
ff0dbd83b2
15 changed files with 217 additions and 121 deletions
9
cli.py
9
cli.py
|
@ -76,7 +76,6 @@ if gamma > 1:
|
||||||
alpha = clamp(alpha, 0, 60)
|
alpha = clamp(alpha, 0, 60)
|
||||||
velocity = clamp(velocity, 1, 5)
|
velocity = clamp(velocity, 1, 5)
|
||||||
|
|
||||||
|
|
||||||
m_ceres = 9.393e+20
|
m_ceres = 9.393e+20
|
||||||
m_earth = 5.9722e+24
|
m_earth = 5.9722e+24
|
||||||
projectile_mass = clamp(projectile_mass, 2 * m_ceres, 2 * m_earth)
|
projectile_mass = clamp(projectile_mass, 2 * m_ceres, 2 * m_earth)
|
||||||
|
@ -88,14 +87,10 @@ scaler.fit(simulations.X)
|
||||||
|
|
||||||
scaled_data = scaler.transform_data(simulations.X)
|
scaled_data = scaler.transform_data(simulations.X)
|
||||||
water_interpolator = RbfInterpolator(scaled_data, simulations.Y_water)
|
water_interpolator = RbfInterpolator(scaled_data, simulations.Y_water)
|
||||||
mass_interpolator = RbfInterpolator(scaled_data, simulations.Y_mass)
|
mass_interpolator = RbfInterpolator(scaled_data, simulations.Y_mantle)
|
||||||
|
|
||||||
testinput = [alpha, velocity, projectile_mass, gamma,
|
testinput = [32, 1, 7.6e22, 0.16, 0.15, 0.15]
|
||||||
target_water_fraction, projectile_water_fraction]
|
|
||||||
|
|
||||||
with open("xl3", "w") as f:
|
|
||||||
f.write("# alpha velocity projectile_mass gamma target_water_fraction projectile_water_fraction\n")
|
|
||||||
f.write(" ".join(map(str, testinput)))
|
|
||||||
|
|
||||||
scaled_input = list(scaler.transform_parameters(testinput))
|
scaled_input = list(scaler.transform_parameters(testinput))
|
||||||
water_retention = water_interpolator.interpolate(*scaled_input)
|
water_retention = water_interpolator.interpolate(*scaled_input)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
water_fraction = False
|
water_fraction = True
|
||||||
|
|
10
cov.py
10
cov.py
|
@ -1,10 +1,14 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from matplotlib import pyplot as plt
|
from matplotlib import pyplot as plt
|
||||||
from matplotlib.axes import Axes
|
from matplotlib.axes import Axes
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from simulation_list import SimulationList
|
from simulation_list import SimulationList
|
||||||
|
|
||||||
simulations = SimulationList.jsonlines_load()
|
plt.style.use('dark_background')
|
||||||
|
|
||||||
|
|
||||||
|
simulations = SimulationList.jsonlines_load(Path("rsmc_dataset.jsonl"))
|
||||||
np.set_printoptions(linewidth=1000, edgeitems=4)
|
np.set_printoptions(linewidth=1000, edgeitems=4)
|
||||||
|
|
||||||
x = simulations.as_matrix
|
x = simulations.as_matrix
|
||||||
|
@ -35,12 +39,12 @@ plt.close()
|
||||||
ax = plt.gca() # type:Axes
|
ax = plt.gca() # type:Axes
|
||||||
print(len(labels), len(simple_cov))
|
print(len(labels), len(simple_cov))
|
||||||
print(simple_cov)
|
print(simple_cov)
|
||||||
plt.barh(range(len(simple_cov)), simple_cov)
|
plt.barh(range(len(simple_cov)), simple_cov,color="#B3DE69")
|
||||||
# ax.set_xticks(index + bar_width / 2)
|
# ax.set_xticks(index + bar_width / 2)
|
||||||
ax.set_yticklabels([0] + labels)
|
ax.set_yticklabels([0] + labels)
|
||||||
ax2 = ax.twinx() # type:Axes
|
ax2 = ax.twinx() # type:Axes
|
||||||
ax2.set_yticklabels([0] + ["({:.2f})".format(a) for a in simple_cov])
|
ax2.set_yticklabels([0] + ["({:.2f})".format(a) for a in simple_cov])
|
||||||
ax2.set_ylim(ax.get_ylim())
|
ax2.set_ylim(ax.get_ylim())
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
plt.savefig("../arbeit/images/cov.pdf")
|
plt.savefig("../arbeit/images/cov.pdf",transparent=True)
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
11
example.py
11
example.py
|
@ -1,14 +1,17 @@
|
||||||
"""
|
"""
|
||||||
Just a demo file on how to quickly read the dataset
|
Just a demo file on how to quickly read the dataset
|
||||||
"""
|
"""
|
||||||
|
from pathlib import Path
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
from simulation_list import SimulationList
|
from simulation_list import SimulationList
|
||||||
|
|
||||||
simlist = SimulationList.jsonlines_load()
|
|
||||||
|
simlist = SimulationList.jsonlines_load(Path("save.jsonl"))
|
||||||
|
|
||||||
for s in simlist.simlist:
|
for s in simlist.simlist:
|
||||||
if not s.testcase:
|
if not s.testcase:
|
||||||
continue
|
continue
|
||||||
print(vars(s))
|
if s.water_retention_both < 0.2:
|
||||||
if s.water_retention_both < 0:
|
pprint(vars(s))
|
||||||
print(s.runid)
|
print(s.water_retention_both)
|
||||||
|
|
|
@ -4,8 +4,8 @@ from torch import nn
|
||||||
class Network(nn.Module):
|
class Network(nn.Module):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.hidden = nn.Linear(6, 50)
|
self.hidden = nn.Linear(6, 70)
|
||||||
self.output = nn.Linear(50, 4)
|
self.output = nn.Linear(70, 4)
|
||||||
|
|
||||||
self.sigmoid = nn.Sigmoid()
|
self.sigmoid = nn.Sigmoid()
|
||||||
self.relu = nn.ReLU()
|
self.relu = nn.ReLU()
|
||||||
|
|
|
@ -73,7 +73,7 @@ def train():
|
||||||
loss_train = []
|
loss_train = []
|
||||||
loss_vali = []
|
loss_vali = []
|
||||||
|
|
||||||
max_epochs = 500
|
max_epochs = 200
|
||||||
epochs = 0
|
epochs = 0
|
||||||
|
|
||||||
fig: Figure = plt.figure()
|
fig: Figure = plt.figure()
|
||||||
|
@ -128,6 +128,16 @@ def train():
|
||||||
# if a > b: # overfitting on training data, stop training
|
# if a > b: # overfitting on training data, stop training
|
||||||
# print("early stopping")
|
# print("early stopping")
|
||||||
# break
|
# break
|
||||||
|
np.savetxt("loss.txt", np.array([x_axis, loss_train, loss_vali]).T)
|
||||||
|
torch.save(network.state_dict(), "pytorch_model.zip")
|
||||||
|
with open("pytorch_model.json", "w") as f:
|
||||||
|
export_dict = {}
|
||||||
|
value_tensor: Tensor
|
||||||
|
for key, value_tensor in network.state_dict().items():
|
||||||
|
export_dict[key] = value_tensor.detach().tolist()
|
||||||
|
export_dict["means"] = scaler.means.tolist()
|
||||||
|
export_dict["stds"] = scaler.stds.tolist()
|
||||||
|
json.dump(export_dict, f)
|
||||||
plt.ioff()
|
plt.ioff()
|
||||||
model_test_y = []
|
model_test_y = []
|
||||||
for x in x_test:
|
for x in x_test:
|
||||||
|
@ -138,53 +148,10 @@ def train():
|
||||||
plt.figure()
|
plt.figure()
|
||||||
plt.xlabel("model output")
|
plt.xlabel("model output")
|
||||||
plt.ylabel("real data")
|
plt.ylabel("real data")
|
||||||
for i, name in enumerate(["shell","mantle","core","mass fraction"]):
|
for i, name in enumerate(["shell", "mantle", "core", "mass fraction"]):
|
||||||
plt.scatter(model_test_y[::, i], Y_test[::, i], s=0.2,label=name)
|
plt.scatter(model_test_y[::, i], Y_test[::, i], s=0.2, label=name)
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.show()
|
plt.show()
|
||||||
torch.save(network.state_dict(), "pytorch_model.zip")
|
|
||||||
with open("pytorch_model.json", "w") as f:
|
|
||||||
export_dict = {}
|
|
||||||
value_tensor: Tensor
|
|
||||||
for key, value_tensor in network.state_dict().items():
|
|
||||||
export_dict[key] = value_tensor.detach().tolist()
|
|
||||||
export_dict["means"] = scaler.means.tolist()
|
|
||||||
export_dict["stds"] = scaler.stds.tolist()
|
|
||||||
json.dump(export_dict, f)
|
|
||||||
|
|
||||||
xrange = np.linspace(-0.5, 60.5, 300)
|
|
||||||
yrange = np.linspace(0.5, 5.5, 300)
|
|
||||||
xgrid, ygrid = np.meshgrid(xrange, yrange)
|
|
||||||
mcode = 1e24
|
|
||||||
wpcode = 1e-4
|
|
||||||
|
|
||||||
wtcode = 1e-4
|
|
||||||
gammacode = 0.6
|
|
||||||
testinput = np.array([[np.nan, np.nan, mcode, gammacode, wtcode, wpcode]] * 300 * 300)
|
|
||||||
testinput[::, 0] = xgrid.flatten()
|
|
||||||
testinput[::, 1] = ygrid.flatten()
|
|
||||||
testinput = scaler.transform_data(testinput)
|
|
||||||
|
|
||||||
print(testinput)
|
|
||||||
print(testinput.shape)
|
|
||||||
testoutput: Tensor = network(from_numpy(testinput).to(torch.float))
|
|
||||||
data = testoutput.detach().numpy()
|
|
||||||
outgrid = np.reshape(data[::, 0], (300, 300))
|
|
||||||
print("minmax")
|
|
||||||
print(np.nanmin(outgrid), np.nanmax(outgrid))
|
|
||||||
cmap = "Blues"
|
|
||||||
plt.figure()
|
|
||||||
plt.title(
|
|
||||||
"m={:3.0e}, gamma={:3.1f}, wt={:2.0f}%, wp={:2.0f}%\n".format(mcode, gammacode, wtcode * 100, wpcode * 100))
|
|
||||||
plt.imshow(outgrid, interpolation='none', cmap=cmap, aspect="auto", origin="lower", vmin=0, vmax=1,
|
|
||||||
extent=[xgrid.min(), xgrid.max(), ygrid.min(), ygrid.max()])
|
|
||||||
|
|
||||||
plt.colorbar().set_label("water retention fraction")
|
|
||||||
plt.xlabel("impact angle $\\alpha$ [$^{\circ}$]")
|
|
||||||
plt.ylabel("velocity $v$ [$v_{esc}$]")
|
|
||||||
plt.tight_layout()
|
|
||||||
# plt.savefig("/home/lukas/tmp/nn.svg", transparent=True)
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
27
nn_single.py
Normal file
27
nn_single.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import torch
|
||||||
|
|
||||||
|
from CustomScaler import CustomScaler
|
||||||
|
from network import Network
|
||||||
|
from simulation_list import SimulationList
|
||||||
|
|
||||||
|
resolution = 100
|
||||||
|
|
||||||
|
with open("pytorch_model.json") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
scaler = CustomScaler()
|
||||||
|
scaler.means = np.array(data["means"])
|
||||||
|
scaler.stds = np.array(data["stds"])
|
||||||
|
|
||||||
|
model = Network()
|
||||||
|
model.load_state_dict(torch.load("pytorch_model.zip"))
|
||||||
|
|
||||||
|
ang = 30
|
||||||
|
v = 2
|
||||||
|
m = 1e24
|
||||||
|
gamma = 0.6
|
||||||
|
wp = wt = 1e-4
|
||||||
|
print(model(torch.Tensor(list(scaler.transform_parameters([ang, v, m, gamma, wt, wp])))))
|
|
@ -6,15 +6,15 @@ authors = ["Lukas Winkler <git@lw1.at>"]
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.8"
|
python = "^3.8"
|
||||||
scipy = "^1.5.4"
|
scipy = "^1.6.1"
|
||||||
numpy = "^1.19.4"
|
numpy = "^1.19.0"
|
||||||
matplotlib = "^3.3.3"
|
matplotlib = "^3.3.4"
|
||||||
tabulate = "^0.8.7"
|
tabulate = "^0.8.7"
|
||||||
|
#Keras = "^2.4.3"
|
||||||
|
#tensorflow = "^2.3.1"
|
||||||
|
pydot = "^1.4.1"
|
||||||
|
|
||||||
|
#"vext.pyqt5" = "^0.7.4"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
|
||||||
PyQt5 = "5.12.1"
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
25
readfiles.py
25
readfiles.py
|
@ -1,4 +1,3 @@
|
||||||
from glob import glob
|
|
||||||
from os import path
|
from os import path
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
@ -6,33 +5,27 @@ from simulation import Simulation
|
||||||
from simulation_list import SimulationList
|
from simulation_list import SimulationList
|
||||||
|
|
||||||
simulation_sets = {
|
simulation_sets = {
|
||||||
"original": sorted(glob("../data/*")),
|
"winter": sorted(Path("../../tmp/winter/").glob("*"))
|
||||||
"cloud": sorted(glob("../../Bachelorarbeit_data/results/*"))
|
# "original": sorted(glob("../data/*")),
|
||||||
|
# "cloud": sorted(glob("../../Bachelorarbeit_data/results/*"))
|
||||||
# "benchmark": sorted(glob("../../Bachelorarbeit_benchmark/results/*"))
|
# "benchmark": sorted(glob("../../Bachelorarbeit_benchmark/results/*"))
|
||||||
}
|
}
|
||||||
simulations = SimulationList()
|
simulations = SimulationList()
|
||||||
|
|
||||||
for set_type, directories in simulation_sets.items():
|
for set_type, directories in simulation_sets.items():
|
||||||
for dir in directories:
|
for dir in directories:
|
||||||
original = set_type == "original"
|
print(dir)
|
||||||
spheres_file = dir + "/spheres_ini_log"
|
spheres_file = dir / "spheres_ini.log"
|
||||||
timings_file = dir + "/pythontimings.json"
|
aggregates_file = sorted(dir.glob("frames/aggregates.*"))[-1]
|
||||||
aggregates_file = dir + ("/sim/aggregates.txt" if original else "/aggregates.txt")
|
|
||||||
if not path.exists(spheres_file) or not path.exists(aggregates_file):
|
if not path.exists(spheres_file) or not path.exists(aggregates_file):
|
||||||
print(f"skipping {dir}")
|
print(f"skipping {dir}")
|
||||||
continue
|
continue
|
||||||
if "id" not in dir and original:
|
|
||||||
continue
|
|
||||||
sim = Simulation()
|
sim = Simulation()
|
||||||
if set_type == "original":
|
sim.load_params_from_setup_txt(dir / "cfg.txt")
|
||||||
sim.load_params_from_dirname(path.basename(dir))
|
|
||||||
else:
|
|
||||||
sim.load_params_from_json(dir + "/parameters.json")
|
|
||||||
sim.type = set_type
|
sim.type = set_type
|
||||||
sim.load_params_from_spheres_ini_log(spheres_file)
|
sim.load_params_from_spheres_ini_log(spheres_file)
|
||||||
sim.load_params_from_aggregates_txt(aggregates_file)
|
sim.load_params_from_aggregates_txt(aggregates_file)
|
||||||
sim.load_params_from_pythontiming_json(timings_file)
|
# sim.assert_all_loaded()
|
||||||
sim.assert_all_loaded()
|
|
||||||
if sim.rel_velocity < 0 or sim.distance < 0:
|
if sim.rel_velocity < 0 or sim.distance < 0:
|
||||||
# Sometimes in the old dataset the second object wasn't detected.
|
# Sometimes in the old dataset the second object wasn't detected.
|
||||||
# To be save, we'll exclude them
|
# To be save, we'll exclude them
|
||||||
|
@ -52,4 +45,4 @@ for set_type, directories in simulation_sets.items():
|
||||||
|
|
||||||
print(len(simulations.simlist))
|
print(len(simulations.simlist))
|
||||||
|
|
||||||
simulations.jsonlines_save(Path("output.jsonl"))
|
simulations.jsonlines_save(Path("winter.jsonl"))
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
import json
|
import json
|
||||||
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
class Simulation:
|
class Simulation:
|
||||||
|
|
||||||
|
@ -132,7 +135,10 @@ class Simulation:
|
||||||
def output_mass_fraction(self) -> Optional[float]:
|
def output_mass_fraction(self) -> Optional[float]:
|
||||||
if not self.largest_aggregate_mass:
|
if not self.largest_aggregate_mass:
|
||||||
return 0 # FIXME
|
return 0 # FIXME
|
||||||
return self.second_largest_aggregate_mass / self.largest_aggregate_mass
|
massive_size_relation=self.largest_aggregate_mass/self.target_mass
|
||||||
|
less_massive_size_relation=self.second_largest_aggregate_mass/self.projectile_mass
|
||||||
|
print("mr",massive_size_relation, less_massive_size_relation)
|
||||||
|
return less_massive_size_relation / massive_size_relation
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def original_simulation(self) -> bool:
|
def original_simulation(self) -> bool:
|
||||||
|
@ -149,7 +155,7 @@ class Simulation:
|
||||||
)
|
)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<Simulation '{self.simulation_key}'>"
|
return f"<Simulation '{vars(self)}'>"
|
||||||
|
|
||||||
def load_params_from_dirname(self, dirname: str) -> None:
|
def load_params_from_dirname(self, dirname: str) -> None:
|
||||||
params = dirname.split("_")
|
params = dirname.split("_")
|
||||||
|
@ -173,8 +179,18 @@ class Simulation:
|
||||||
self.wtcode = data["wt_code"]
|
self.wtcode = data["wt_code"]
|
||||||
self.wpcode = data["wp_code"]
|
self.wpcode = data["wp_code"]
|
||||||
|
|
||||||
def load_params_from_spheres_ini_log(self, filename: str) -> None:
|
def load_params_from_setup_txt(self, file: Path) -> None:
|
||||||
with open(filename) as f:
|
with file.open() as f:
|
||||||
|
data = yaml.safe_load(f)
|
||||||
|
# self.runid=data["ID"]
|
||||||
|
# self.vcode=data["vel_vesc_touching_ball"]
|
||||||
|
# self.alphacode=data["impact_angle_touching_ball"]
|
||||||
|
# self.mcode=data["M_tot"]
|
||||||
|
# self.gammacode=data["gamma"]
|
||||||
|
# TODO: maybe more needed?
|
||||||
|
|
||||||
|
def load_params_from_spheres_ini_log(self, filename: Path) -> None:
|
||||||
|
with filename.open() as f:
|
||||||
lines = [line.rstrip("\n") for line in f]
|
lines = [line.rstrip("\n") for line in f]
|
||||||
for i in range(len(lines)):
|
for i in range(len(lines)):
|
||||||
line = lines[i]
|
line = lines[i]
|
||||||
|
@ -191,20 +207,25 @@ class Simulation:
|
||||||
self.projectile_water_fraction = float(lines[i + 1].split()[7])
|
self.projectile_water_fraction = float(lines[i + 1].split()[7])
|
||||||
self.target_water_fraction = float(lines[i + 3].split()[7])
|
self.target_water_fraction = float(lines[i + 3].split()[7])
|
||||||
if "Particle numbers" in line:
|
if "Particle numbers" in line:
|
||||||
self.desired_N = int(lines[i + 1].split()[3])
|
self.desired_N = int(lines[i + 1].split()[4])
|
||||||
self.actual_N = int(lines[i + 1].split()[-1])
|
self.actual_N = int(lines[i + 1].split()[-1])
|
||||||
|
|
||||||
def load_params_from_aggregates_txt(self, filename: str) -> None:
|
def load_params_from_aggregates_txt(self, filename: Path) -> None:
|
||||||
with open(filename) as f:
|
with filename.open() as f:
|
||||||
lines = [line.rstrip("\n") for line in f]
|
lines = [line.rstrip("\n") for line in f]
|
||||||
for i in range(len(lines)):
|
for i in range(len(lines)):
|
||||||
line = lines[i]
|
line = lines[i]
|
||||||
if "# largest aggregate" in line:
|
if "# largest aggregate" in line:
|
||||||
self.largest_aggregate_mass = float(lines[i + 2].split()[0])
|
cols = lines[i + 2].split()
|
||||||
self.largest_aggregate_water_fraction = float(lines[i + 2].split()[2])
|
self.largest_aggregate_mass = float(cols[0])
|
||||||
|
self.largest_aggregate_core_fraction = float(cols[1])
|
||||||
|
self.largest_aggregate_water_fraction = 1 - float(cols[2]) - self.largest_aggregate_core_fraction
|
||||||
if "# 2nd-largest aggregate:" in line:
|
if "# 2nd-largest aggregate:" in line:
|
||||||
self.second_largest_aggregate_mass = float(lines[i + 2].split()[0])
|
cols = lines[i + 2].split()
|
||||||
self.second_largest_aggregate_water_fraction = float(lines[i + 2].split()[2])
|
self.second_largest_aggregate_mass = float(cols[0])
|
||||||
|
self.second_largest_aggregate_core_fraction = float(cols[1])
|
||||||
|
self.second_largest_aggregate_water_fraction = 1 - float(
|
||||||
|
cols[2]) - self.second_largest_aggregate_core_fraction
|
||||||
if "# distance" in line: # TODO: not sure if correct anymore
|
if "# distance" in line: # TODO: not sure if correct anymore
|
||||||
self.distance = float(lines[i + 1].split()[0])
|
self.distance = float(lines[i + 1].split()[0])
|
||||||
self.rel_velocity = float(lines[i + 1].split()[1])
|
self.rel_velocity = float(lines[i + 1].split()[1])
|
||||||
|
|
|
@ -78,3 +78,7 @@ class SimulationList:
|
||||||
@property
|
@property
|
||||||
def Y_mantle(self):
|
def Y_mantle(self):
|
||||||
return np.array([s.mantle_retention_both for s in self.simlist if not s.testcase])
|
return np.array([s.mantle_retention_both for s in self.simlist if not s.testcase])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def Y_mass_fraction(self):
|
||||||
|
return np.array([s.output_mass_fraction for s in self.simlist if not s.testcase])
|
||||||
|
|
22
sliders.py
22
sliders.py
|
@ -10,17 +10,18 @@ from interpolators.rbf import RbfInterpolator
|
||||||
from simulation_list import SimulationList
|
from simulation_list import SimulationList
|
||||||
|
|
||||||
simlist = SimulationList.jsonlines_load(Path("rsmc_dataset.jsonl"))
|
simlist = SimulationList.jsonlines_load(Path("rsmc_dataset.jsonl"))
|
||||||
|
resolution = 100
|
||||||
|
|
||||||
data = simlist.X
|
data = simlist.X
|
||||||
values = simlist.Y
|
values = simlist.Y_mass_fraction
|
||||||
|
|
||||||
scaler = CustomScaler()
|
scaler = CustomScaler()
|
||||||
scaler.fit(data)
|
scaler.fit(data)
|
||||||
scaled_data = scaler.transform_data(data)
|
scaled_data = scaler.transform_data(data)
|
||||||
interpolator = RbfInterpolator(scaled_data, values)
|
interpolator = RbfInterpolator(scaled_data, values)
|
||||||
|
|
||||||
alpharange = np.linspace(-0.5, 60.5, 100)
|
alpharange = np.linspace(-0.5, 60.5, resolution)
|
||||||
vrange = np.linspace(0.5, 5.5, 100)
|
vrange = np.linspace(0.5, 5.5, resolution)
|
||||||
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
||||||
|
|
||||||
fig, ax = plt.subplots()
|
fig, ax = plt.subplots()
|
||||||
|
@ -30,7 +31,7 @@ mcode_default, gamma_default, wt_default, wp_default = [24.0, 1, 15.0, 15.0]
|
||||||
|
|
||||||
datagrid = np.zeros_like(grid_alpha)
|
datagrid = np.zeros_like(grid_alpha)
|
||||||
|
|
||||||
mesh = plt.pcolormesh(grid_alpha, grid_v, datagrid, cmap="Blues", vmin=0, vmax=1) # type:QuadMesh
|
mesh = plt.pcolormesh(grid_alpha, grid_v, datagrid, cmap="Blues", vmin=0, vmax=1, shading="nearest") # type:QuadMesh
|
||||||
plt.colorbar()
|
plt.colorbar()
|
||||||
|
|
||||||
# axcolor = 'lightgoldenrodyellow'
|
# axcolor = 'lightgoldenrodyellow'
|
||||||
|
@ -44,8 +45,8 @@ button = Button(buttonax, 'Update', hovercolor='0.975')
|
||||||
|
|
||||||
s_mcode = Slider(ax_mcode, 'mcode', 21, 25, valinit=mcode_default)
|
s_mcode = Slider(ax_mcode, 'mcode', 21, 25, valinit=mcode_default)
|
||||||
s_gamma = Slider(ax_gamma, 'gamma', 0.1, 1, valinit=gamma_default)
|
s_gamma = Slider(ax_gamma, 'gamma', 0.1, 1, valinit=gamma_default)
|
||||||
s_wt = Slider(ax_wt, 'wt', 1e-5, 1e-4, valinit=wt_default)
|
s_wt = Slider(ax_wt, 'wt', 1e-5, 1e-3, valinit=wt_default)
|
||||||
s_wp = Slider(ax_wp, 'wp', 1e-5, 1e-4, valinit=wp_default)
|
s_wp = Slider(ax_wp, 'wp', 1e-5, 1e-3, valinit=wp_default)
|
||||||
|
|
||||||
|
|
||||||
def update(val):
|
def update(val):
|
||||||
|
@ -57,23 +58,24 @@ def update(val):
|
||||||
gamma = s_gamma.val
|
gamma = s_gamma.val
|
||||||
wt = s_wt.val
|
wt = s_wt.val
|
||||||
wp = s_wp.val
|
wp = s_wp.val
|
||||||
parameters = [grid_alpha, grid_v, 10 ** mcode, gamma, wt / 100, wp / 100]
|
parameters = [grid_alpha, grid_v, 10 ** mcode, gamma, wt, wp]
|
||||||
scaled_parameters = list(scaler.transform_parameters(parameters))
|
scaled_parameters = list(scaler.transform_parameters(parameters))
|
||||||
|
|
||||||
datagrid = interpolator.interpolate(*scaled_parameters)
|
datagrid = interpolator.interpolate(*scaled_parameters)
|
||||||
print(datagrid)
|
print(datagrid)
|
||||||
print(np.isnan(datagrid).sum() / (100 * 100))
|
print(np.isnan(datagrid).sum() / (resolution * resolution))
|
||||||
if not isinstance(datagrid, np.ndarray):
|
if not isinstance(datagrid, np.ndarray):
|
||||||
return False
|
return False
|
||||||
formatedgrid = datagrid[:-1, :-1]
|
|
||||||
|
|
||||||
mesh.set_array(formatedgrid.ravel())
|
mesh.set_array(datagrid.ravel())
|
||||||
print("finished updating")
|
print("finished updating")
|
||||||
# thetext.set_text("finished")
|
# thetext.set_text("finished")
|
||||||
|
|
||||||
fig.canvas.draw_idle()
|
fig.canvas.draw_idle()
|
||||||
|
|
||||||
|
|
||||||
|
update(None)
|
||||||
|
|
||||||
# s_gamma.on_changed(update)
|
# s_gamma.on_changed(update)
|
||||||
# s_mcode.on_changed(update)
|
# s_mcode.on_changed(update)
|
||||||
# s_wp.on_changed(update)
|
# s_wp.on_changed(update)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from pathlib import Path
|
import json
|
||||||
|
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -8,21 +8,21 @@ from matplotlib.widgets import Slider
|
||||||
|
|
||||||
from CustomScaler import CustomScaler
|
from CustomScaler import CustomScaler
|
||||||
from network import Network
|
from network import Network
|
||||||
from simulation_list import SimulationList
|
|
||||||
|
|
||||||
simlist = SimulationList.jsonlines_load(Path("rsmc_dataset.jsonl"))
|
|
||||||
resolution = 100
|
resolution = 100
|
||||||
|
|
||||||
data = simlist.X
|
with open("pytorch_model.json") as f:
|
||||||
scaler = CustomScaler()
|
data = json.load(f)
|
||||||
scaler.fit(data)
|
scaler = CustomScaler()
|
||||||
|
scaler.means = np.array(data["means"])
|
||||||
|
scaler.stds = np.array(data["stds"])
|
||||||
|
|
||||||
fig, ax = plt.subplots()
|
fig, ax = plt.subplots()
|
||||||
plt.subplots_adjust(bottom=0.35)
|
plt.subplots_adjust(bottom=0.35)
|
||||||
t = np.arange(0.0, 1.0, 0.001)
|
t = np.arange(0.0, 1.0, 0.001)
|
||||||
mcode_default, gamma_default, wt_default, wp_default = [24.0, 1, 15.0, 15.0]
|
mcode_default, gamma_default, wt_default, wp_default = [24.0, 1, 15.0, 15.0]
|
||||||
|
|
||||||
alpharange = np.linspace(-0.5, 60.5, resolution)
|
alpharange = np.linspace(0, 60, resolution)
|
||||||
vrange = np.linspace(0.5, 5.5, resolution)
|
vrange = np.linspace(0.5, 5.5, resolution)
|
||||||
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
||||||
|
|
||||||
|
|
30
visualize.py
30
visualize.py
|
@ -6,15 +6,16 @@ from matplotlib import pyplot as plt, cm
|
||||||
|
|
||||||
from CustomScaler import CustomScaler
|
from CustomScaler import CustomScaler
|
||||||
from config import water_fraction
|
from config import water_fraction
|
||||||
|
from interpolators.griddata import GriddataInterpolator
|
||||||
from interpolators.rbf import RbfInterpolator
|
from interpolators.rbf import RbfInterpolator
|
||||||
|
from simulation import Simulation
|
||||||
from simulation_list import SimulationList
|
from simulation_list import SimulationList
|
||||||
|
|
||||||
|
plt.style.use('dark_background')
|
||||||
# plt.style.use('dark_background')
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
mcode, gamma, wt, wp = [10 ** 21, 0.6, 1e-5, 1e-5]
|
mcode, gamma, wt, wp = [10 ** 22, 0.6, 1e-5, 1e-5]
|
||||||
simlist = SimulationList.jsonlines_load(Path("rsmc_dataset.jsonl"))
|
simlist = SimulationList.jsonlines_load(Path("rsmc_dataset.jsonl"))
|
||||||
# for s in simlist.simlist:
|
# for s in simlist.simlist:
|
||||||
# if s.type!="original":
|
# if s.type!="original":
|
||||||
|
@ -26,7 +27,7 @@ def main():
|
||||||
print(len(data))
|
print(len(data))
|
||||||
# print(data[0])
|
# print(data[0])
|
||||||
# exit()
|
# exit()
|
||||||
values = simlist.Y
|
values = simlist.Y_mass_fraction
|
||||||
|
|
||||||
scaler = CustomScaler()
|
scaler = CustomScaler()
|
||||||
scaler.fit(data)
|
scaler.fit(data)
|
||||||
|
@ -34,7 +35,7 @@ def main():
|
||||||
interpolator = RbfInterpolator(scaled_data, values)
|
interpolator = RbfInterpolator(scaled_data, values)
|
||||||
# interpolator = GriddataInterpolator(scaled_data, values)
|
# interpolator = GriddataInterpolator(scaled_data, values)
|
||||||
|
|
||||||
alpharange = np.linspace(-0.5, 60.5, 300)
|
alpharange = np.linspace(0, 60, 300)
|
||||||
vrange = np.linspace(0.5, 5.5, 300)
|
vrange = np.linspace(0.5, 5.5, 300)
|
||||||
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
||||||
|
|
||||||
|
@ -53,13 +54,28 @@ def main():
|
||||||
# plt.pcolormesh(grid_alpha, grid_v, grid_result, cmap="Blues", vmin=0, vmax=1)
|
# plt.pcolormesh(grid_alpha, grid_v, grid_result, cmap="Blues", vmin=0, vmax=1)
|
||||||
plt.imshow(grid_result, interpolation='none', cmap=cmap, aspect="auto", origin="lower", vmin=0, vmax=1,
|
plt.imshow(grid_result, interpolation='none', cmap=cmap, aspect="auto", origin="lower", vmin=0, vmax=1,
|
||||||
extent=[grid_alpha.min(), grid_alpha.max(), grid_v.min(), grid_v.max()])
|
extent=[grid_alpha.min(), grid_alpha.max(), grid_v.min(), grid_v.max()])
|
||||||
plt.colorbar().set_label("water retention fraction" if water_fraction else "core mass retention fraction")
|
|
||||||
# plt.scatter(data[:, 0], data[:, 1], c=values, cmap="Blues")
|
# plt.scatter(data[:, 0], data[:, 1], c=values, cmap="Blues")
|
||||||
plt.xlabel("impact angle $\\alpha$ [$^{\circ}$]")
|
plt.xlabel("impact angle $\\alpha$ [$^{\circ}$]")
|
||||||
plt.ylabel("velocity $v$ [$v_{esc}$]")
|
plt.ylabel("velocity $v$ [$v_{esc}$]")
|
||||||
|
s: Simulation
|
||||||
|
xs = []
|
||||||
|
ys = []
|
||||||
|
zs = []
|
||||||
|
for s in simlist.simlist:
|
||||||
|
# if not (0.4 < s.gamma < 0.6) or not (1e23 < s.total_mass < 5e24):
|
||||||
|
# continue
|
||||||
|
# if s.alpha < 60 or s.v > 5 or s.v < 2:
|
||||||
|
# continue
|
||||||
|
z = s.output_mass_fraction
|
||||||
|
zs.append(z)
|
||||||
|
xs.append(s.alpha)
|
||||||
|
ys.append(s.v)
|
||||||
|
print(z, s.runid)
|
||||||
|
plt.scatter(xs, ys, c=zs, cmap=cmap, vmin=0, vmax=1)
|
||||||
|
plt.colorbar().set_label("stone retention fraction" if water_fraction else "core mass retention fraction")
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
# plt.savefig("vis.png", transparent=True)
|
# plt.savefig("vis.png", transparent=True)
|
||||||
plt.savefig("/home/lukas/tmp/test.svg", transparent=True)
|
plt.savefig("/home/lukas/tmp/test.pdf", transparent=True)
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
|
64
visualize_nn.py
Normal file
64
visualize_nn.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import torch
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from torch import from_numpy, Tensor
|
||||||
|
|
||||||
|
from CustomScaler import CustomScaler
|
||||||
|
from network import Network
|
||||||
|
|
||||||
|
resolution = 300
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
mcode, gamma, wt, wp = [10 ** 24, 0.4, 1e-5, 1e-5]
|
||||||
|
with open("pytorch_model.json") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
scaler = CustomScaler()
|
||||||
|
scaler.means = np.array(data["means"])
|
||||||
|
scaler.stds = np.array(data["stds"])
|
||||||
|
|
||||||
|
model = Network()
|
||||||
|
model.load_state_dict(torch.load("pytorch_model.zip"))
|
||||||
|
|
||||||
|
alpharange = np.linspace(0, 60, resolution)
|
||||||
|
vrange = np.linspace(0.5, 5.5, resolution)
|
||||||
|
grid_alpha, grid_v = np.meshgrid(alpharange, vrange)
|
||||||
|
mcode = 1e24
|
||||||
|
wpcode = 1e-5
|
||||||
|
|
||||||
|
wtcode = 1e-5
|
||||||
|
gammacode = 0.6
|
||||||
|
testinput = np.array([[np.nan, np.nan, mcode, gammacode, wtcode, wpcode]] * resolution * resolution)
|
||||||
|
testinput[::, 0] = grid_alpha.flatten()
|
||||||
|
testinput[::, 1] = grid_v.flatten()
|
||||||
|
testinput = scaler.transform_data(testinput)
|
||||||
|
|
||||||
|
print(testinput)
|
||||||
|
print(testinput.shape)
|
||||||
|
network = Network()
|
||||||
|
network.load_state_dict(torch.load("pytorch_model.zip"))
|
||||||
|
|
||||||
|
print(testinput)
|
||||||
|
testoutput: Tensor = network(from_numpy(testinput).to(torch.float))
|
||||||
|
data = testoutput.detach().numpy()
|
||||||
|
grid_result = np.reshape(data[::, 0], (300, 300))
|
||||||
|
print("minmax")
|
||||||
|
print(np.nanmin(grid_result), np.nanmax(grid_result))
|
||||||
|
cmap = "Blues"
|
||||||
|
plt.figure()
|
||||||
|
plt.title(
|
||||||
|
"m={:3.0e}, gamma={:3.1f}, wt={:2.0e}%, wp={:2.0e}%\n".format(mcode, gammacode, wtcode, wpcode))
|
||||||
|
plt.imshow(grid_result, interpolation='none', cmap=cmap, aspect="auto", origin="lower", vmin=0, vmax=1,
|
||||||
|
extent=[grid_alpha.min(), grid_alpha.max(), grid_v.min(), grid_v.max()])
|
||||||
|
|
||||||
|
plt.colorbar().set_label("water retention fraction")
|
||||||
|
plt.xlabel("impact angle $\\alpha$ [$^{\circ}$]")
|
||||||
|
plt.ylabel("velocity $v$ [$v_{esc}$]")
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig("/home/lukas/tmp/nn.pdf", transparent=True)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in a new issue