Implemented qt port + e2e
This commit is contained in:
+17
-15
@@ -51,19 +51,19 @@ NUM_ROWS = S.NUM_ROWS # producer cycles written to the FileReader input
|
||||
ROW_DT = S.ROW_DT # seconds per producer cycle (row); 1 kHz producer
|
||||
|
||||
|
||||
def _sample_dt(sig):
|
||||
def _sample_dt(sig, row_dt=ROW_DT):
|
||||
"""Per-element time spacing (s) for a signal."""
|
||||
if sig["sampling_rate"]:
|
||||
return 1.0 / sig["sampling_rate"]
|
||||
e = sig["elements"]
|
||||
return ROW_DT / e if e > 1 else ROW_DT
|
||||
return row_dt / e if e > 1 else row_dt
|
||||
|
||||
|
||||
def _sample_times(sig):
|
||||
"""Flattened intended sample times (s): NUM_ROWS*elements values."""
|
||||
def _sample_times(sig, row_dt=ROW_DT, num_rows=NUM_ROWS):
|
||||
"""Flattened intended sample times (s): num_rows*elements values."""
|
||||
e = sig["elements"]
|
||||
sdt = _sample_dt(sig)
|
||||
rows = np.arange(NUM_ROWS, dtype=np.float64).reshape(-1, 1) * ROW_DT
|
||||
sdt = _sample_dt(sig, row_dt)
|
||||
rows = np.arange(num_rows, dtype=np.float64).reshape(-1, 1) * row_dt
|
||||
cols = np.arange(e, dtype=np.float64).reshape(1, -1) * sdt
|
||||
return (rows + cols).reshape(-1)
|
||||
|
||||
@@ -99,15 +99,16 @@ def _native(sig, vals):
|
||||
|
||||
def build_ground_truth(scenario):
|
||||
"""Return {"<src>:<sig>": gt_dict} for every signal in the scenario."""
|
||||
row_dt, num_rows, _ph, _lh = S.geometry(scenario)
|
||||
gt = {}
|
||||
for src in scenario["sources"]:
|
||||
for sig in src["signals"]:
|
||||
t = _sample_times(sig)
|
||||
t = _sample_times(sig, row_dt, num_rows)
|
||||
v = _native(sig, _values(sig, t))
|
||||
gt[f"{src['id']}:{sig['name']}"] = {
|
||||
"t": t, "v": v, "dt": _sample_dt(sig),
|
||||
"t": t, "v": v, "dt": _sample_dt(sig, row_dt),
|
||||
"formula": sig["formula"], "freq": sig["freq"],
|
||||
"elements": sig["elements"], "rows": NUM_ROWS,
|
||||
"elements": sig["elements"], "rows": num_rows,
|
||||
"type": sig["type"], "quant": sig["quant"],
|
||||
"range_min": sig["range_min"], "range_max": sig["range_max"],
|
||||
"is_time": sig["is_time"],
|
||||
@@ -126,25 +127,26 @@ def write_input(scenario, path):
|
||||
"""
|
||||
os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True)
|
||||
gt = build_ground_truth(scenario)
|
||||
row_dt, num_rows, _ph, _lh = S.geometry(scenario)
|
||||
|
||||
# write each source to its own file: <path> for src[0], <path>.<srcid> else.
|
||||
written = {}
|
||||
for i, src in enumerate(scenario["sources"]):
|
||||
p = path if i == 0 else f"{path}.{src['id']}"
|
||||
_write_source_bin(src, p)
|
||||
_write_source_bin(src, p, row_dt, num_rows)
|
||||
written[src["id"]] = p
|
||||
gt["_files"] = written
|
||||
return gt
|
||||
|
||||
|
||||
def _write_source_bin(src, path):
|
||||
def _write_source_bin(src, path, row_dt=ROW_DT, num_rows=NUM_ROWS):
|
||||
sigs = src["signals"]
|
||||
# per-signal native 2D arrays [NUM_ROWS, elements]
|
||||
# per-signal native 2D arrays [num_rows, elements]
|
||||
cols = {}
|
||||
for sig in sigs:
|
||||
t = _sample_times(sig)
|
||||
t = _sample_times(sig, row_dt, num_rows)
|
||||
v = _native(sig, _values(sig, t))
|
||||
cols[sig["name"]] = v.reshape(NUM_ROWS, sig["elements"])
|
||||
cols[sig["name"]] = v.reshape(num_rows, sig["elements"])
|
||||
|
||||
with open(path, "wb") as f:
|
||||
f.write(struct.pack("<I", len(sigs)))
|
||||
@@ -153,7 +155,7 @@ def _write_source_bin(src, path):
|
||||
name = (sig["name"] + "\0").encode()
|
||||
f.write((name + b"\0" * 32)[:32])
|
||||
f.write(struct.pack("<I", sig["elements"]))
|
||||
for r in range(NUM_ROWS):
|
||||
for r in range(num_rows):
|
||||
for sig in sigs:
|
||||
f.write(cols[sig["name"]][r].tobytes())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user