From 8b2c96c41066ccf7dba2e040c40649afef968dea Mon Sep 17 00:00:00 2001
From: Yifan Zhao <yifanz16@illinois.edu>
Date: Tue, 6 Apr 2021 23:43:27 -0500
Subject: [PATCH] Changing metadata protocol

---
 predtuner/pipedbin.py | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/predtuner/pipedbin.py b/predtuner/pipedbin.py
index bfa277c..81581b6 100644
--- a/predtuner/pipedbin.py
+++ b/predtuner/pipedbin.py
@@ -165,37 +165,31 @@ class PipedBinaryApp(ModeledApp):
             metadata = json.load(f)
         op_costs = metadata["op_cost"]
         op_knobs = metadata["op_knobs"]
-        knob_speedup = metadata["knob_speedup"]
-        knob_devices = metadata["knob_devices"]
-        baseline_knob = metadata["baseline_knob"]
+        knobs = metadata["knobs"]
         # Check sanity
         if set(op_costs.keys()) != set(op_knobs.keys()):
             raise ValueError(
                 "Operators listed in layer_cost and knobs_of_layer mismatch"
             )
-        if set(knob_speedup.keys()) != set(knob_devices.keys()):
-            raise ValueError(
-                "Knobs listed in knob_speedup and knob_devices mismatch"
-            )
         knobs_used = set().union(*[set(knobs) for knobs in op_knobs.values()])
-        knobs_defined = set(knob_speedup.keys())
+        knobs_defined = set(knobs.keys())
         undefined = knobs_used - knobs_defined
         if undefined:
             raise ValueError(
                 f"These knobs used in knobs_of_layer are undefined: {undefined}"
             )
-        if baseline_knob not in knobs_defined:
-            raise ValueError(f"baseline_knob {baseline_knob} is undefined")
         # Create actual knob object from knob names
-        name2knob = {
-            s: ApproxKnob(s, knob_devices[s], (0 if s == baseline_knob else None))
-            for s in knobs_used
-        }
-        op_knobs = {op: [name2knob[k] for k in knobs] for op, knobs in op_knobs.items()}
+        knob_objs = {}
+        knob_speedup = {}
+        for knob_name, knob_args in knobs.items():
+            knob_speedup[knob_name] = knob_args.pop("speedup")
+            knob_objs[knob_name] = ApproxKnob(knob_name, **knob_args)
+        op_knobs = {op: [knob_objs[k] for k in knobs] for op, knobs in op_knobs.items()}
+        # Process other fields in metadata
         tune_labels_file = Path(metadata["tune_labels_path"])
         tune_labels = torch.from_numpy(np.fromfile(tune_labels_file, dtype=np.int32))
         conf_file = Path(metadata["conf_path"])
-        # Our "w" file is the binary's "r" file, vice versa
+        # -- Our "w" file is the binary's "r" file, vice versa
         fifo_r_file = Path(metadata["fifo_path_w"])
         fifo_w_file = Path(metadata["fifo_path_r"])
         return (
-- 
GitLab