-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
85 lines (65 loc) · 2.42 KB
/
main.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
import argparse
import yaml
import numpy as np
import os
import itertools as it
from numpy.random import uniform
from simulate import simulate
from save_results import save_results
def parse_commandline():
parser = argparse.ArgumentParser(
description=(
"Simulate the interaction between system of particles and camera with multiple sensors"
)
)
parser.add_argument(
"--config_file",
"-c",
required=True,
help="path to YAML configuration file with simulation options",
)
parser.add_argument(
"--output_folder",
"-o",
default="data",
help="path to the folder to store the results",
)
return parser.parse_args()
def add_suffix(file, suffix):
file_name, file_extension = os.path.splitext(file)
file = file_name + suffix + file_extension
return file
def generate_coords(coord_p_ranges, nconfigs):
nparticles = coord_p_ranges.shape[0]
coords_p_vals = np.empty((nconfigs, nparticles, 3))
for i in range(nparticles):
for j in range(3):
low = coord_p_ranges[i, j, 0]
high = coord_p_ranges[i, j, 1]
coords_p_vals[:, i, j] = uniform(low, high, nconfigs)
return coords_p_vals
def get_camera_basis(nsensors, spin_s):
spin_levels = np.arange(spin_s, -(spin_s + 1), -1)
camera_basis = np.array(list(it.product(spin_levels, repeat=nsensors)))
return camera_basis
def main():
args = parse_commandline()
os.makedirs(args.output_folder, exist_ok=True)
o_file = os.path.join(args.output_folder, "output.h5")
with open(args.config_file, "r") as config_file:
c = yaml.safe_load(config_file)
nconfigs_vals = c["nconfigs"]
nsims = len(nconfigs_vals)
spin_p, spin_s = c['particles']['spin'], c['sensors']['spin']
coords_s = np.array(c['sensors']['coordinates'])
nsensors = coords_s.shape[0]
for nconfigs in nconfigs_vals:
print(f"Simulating {nconfigs} configurations:")
coords_p_vals = generate_coords(np.array(c['particles']['coordinates']), nconfigs)
probs = simulate(coords_p_vals, coords_s, spin_p, spin_s,
c["B"], c["t"], c['sensors']['init_state'])
basis = get_camera_basis(nsensors, spin_s)
suffix = "" if nsims == 1 else f"_{nconfigs}"
save_results(basis, probs, coords_p_vals, add_suffix(o_file, suffix))
if __name__ == "__main__":
main()