From 907ef753529722f1207a4ae39d54ff0fb2e898bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ma=C3=ABl=20Madon?= <mael.madon@irit.fr>
Date: Wed, 20 Apr 2022 14:55:42 +0200
Subject: [PATCH] added experiments with a constant alpha in the 3rd campaign

---
 campaign3.py | 23 ++++++++++++++++----
 instance3.py | 61 ++++++++++++++++++++++++++++++++++------------------
 2 files changed, 59 insertions(+), 25 deletions(-)

diff --git a/campaign3.py b/campaign3.py
index b724a3c..c978c7c 100755
--- a/campaign3.py
+++ b/campaign3.py
@@ -11,7 +11,7 @@ from dateutil import parser
 import concurrent.futures
 
 from scripts.util import WL_DIR
-from instance3 import start_instance
+from instance3 import expe_alpha_cst, expe_alpha_normal
 
 ###############################
 # Prepare the start date sample
@@ -44,12 +44,27 @@ with open(f"{WL_DIR}/start_days_for_campaign2.txt", 'w') as f:
 nb_expe = 10
 
 with concurrent.futures.ProcessPoolExecutor() as executor:
+    
+    # print("##############\n"
+    #     "First batch of expe: with alpha drawn at random for each user\n"
+    #     "##############")
+    # instances = []
+    # for i in range(nb_expe):
+    #     print(f"Submit expe {i}")
+    #     # expe_alpha_normal(expe_num, start_date, prepare_workload, clean_log)
+    #     instances.append(executor.submit(
+    #         expe_alpha_normal, i, expe_start_time[i], False, True))
+    # for instance in concurrent.futures.as_completed(instances):
+    #     print(f"Expe {instance.result()} terminated")
+
+    print("##############\n"
+        "Second batch of expe: with alpha=0.5, 0.75, 0.88\n"
+        "##############")
     instances = []
     for i in range(nb_expe):
         print(f"Submit expe {i}")
-        # start_instance(expe_num, start_date, prepare_workload, clean_log)
+        # expe_alpha_cst(expe_num, start_date, prepare_workload, clean_log)
         instances.append(executor.submit(
-            start_instance, i, expe_start_time[i], True, True))
-
+            expe_alpha_cst, i, expe_start_time[i], False, True))
     for instance in concurrent.futures.as_completed(instances):
         print(f"Expe {instance.result()} terminated")
diff --git a/instance3.py b/instance3.py
index 06dde7f..abac138 100755
--- a/instance3.py
+++ b/instance3.py
@@ -30,13 +30,30 @@ def prepare_input_data(expe_num, start_date):
         job_walltime_factor=8)
 
 
-def run_expe(expe_num, seed_alpha, clean_log):
-    """Run batmen with reconfig behavior and a 4-hour DR window.
+def run_expe(expe_num, alpha_cst=None, seed_alpha=None, clean_log=True):
+    """
+    Run batmen with reconfig behavior and a 4-hour DR window.
+    Expe_num should be a small integer (eg < 100)
+
+    Mode alpha constant (alpha_cst != None)
+    ------------
+    Same alpha for all jobs (preferrably between 0.5 and 1)
+
+    Mode alpha randomly generated (seed_alpha != None)
+    ------------
     For each user, alpha is drawn at random following a Gaussian distribution
     such that 0.5<alpha<1 in 95% of the cases (mean = 0.75, sigma = 0.125)
-    Expe_num should be a small integer (eg < 100)"""
+    """
+    assert (alpha_cst == None) != (seed_alpha == None), "Either alpha_cst or \
+        seed_alpha should be non-None, and not both at the same time"
+
     # Useful vars and output folder
-    EXPE_DIR = f"{ROOT_DIR}/out/campaign3/expe{expe_num}/seed_alpha_{seed_alpha}"
+    if seed_alpha != None:
+        # Initialize the random generator
+        random.seed(seed_alpha)
+        EXPE_DIR = f"{ROOT_DIR}/out/campaign3/expe{expe_num}/seed_alpha_{seed_alpha}"
+    else:
+        EXPE_DIR = f"{ROOT_DIR}/out/campaign3/expe{expe_num}/alpha_cst_{int(alpha_cst*100):03d}"
     create_dir_rec_if_needed(EXPE_DIR)
     create_dir_rec_if_needed(f"{EXPE_DIR}/cmd")
     EXPE_FILE = f"{EXPE_DIR}/cmd/robinfile.yaml"
@@ -44,22 +61,23 @@ def run_expe(expe_num, seed_alpha, clean_log):
     pf = f"{ROOT_DIR}/platform/average_metacentrum.xml"
     wl = f"{WL_DIR}/empty_workload.json"
     uf = f"{EXPE_DIR}/cmd/user_description_file.json"
-    window_size = 4
-
-    # Initialize the random generator
-    random.seed(seed_alpha)
 
     # Demand response window, from 16 to (16 + window_size) on day2
+    window_size = 4
     dm_window = [(24+16)*3600, (int) ((24+16+window_size)*3600)]
 
     # User description file
     def user_description(user):
+        if seed_alpha != None:
+            alpha = random.normalvariate(0.75, 0.125)
+        else:
+            alpha = alpha_cst
         return {
             "name": user,
             "category": "dm_user_reconfig",
             "param": {
                 "input_json": f"{wl_folder}/{user}.json",
-                "alpha_speedup": random.normalvariate(0.75, 0.125)
+                "alpha_speedup": alpha
             }
         }
     user_names = [user_file.split('.')[0] for user_file in os.listdir(wl_folder)]
@@ -96,7 +114,7 @@ def run_expe(expe_num, seed_alpha, clean_log):
 
 
 
-def start_instance(expe_num, start_date, prepare_workload=True, clean_log=False):
+def expe_alpha_normal(expe_num, start_date, prepare_workload=True, clean_log=False):
     # Prepare workload
     if prepare_workload:
         prepare_input_data(expe_num, start_date)
@@ -112,17 +130,18 @@ def start_instance(expe_num, start_date, prepare_workload=True, clean_log=False)
 
     return expe_num
 
-# def main():
-#     parser = argparse.ArgumentParser(
-#         description='One expe instance. To launch for example with `oarsub -l walltime=2 "./instance3 arg1 arg2 arg3"`')
-#     parser.add_argument('expe_num', type=int, help='The expe ID')
-#     parser.add_argument('start_date', type=int, 
-#                         help='Start of the 3-day window (in seconds since the start of the original trace)')
-#     args = parser.parse_args()
-    
-#     start_instance(args.expe_num, args.start_date)
+def expe_alpha_cst(expe_num, start_date, prepare_workload=True, clean_log=False):
+    # Prepare workload
+    if prepare_workload:
+        prepare_input_data(expe_num, start_date)
 
+    # Create expe folder
+    create_dir_rec_if_needed(f"{ROOT_DIR}/out/campaign3")
+    create_dir_rec_if_needed(f"{ROOT_DIR}/out/campaign3/expe{expe_num}")
 
+    # Run with various random seeds
+    alpha_csts = [.5, .75, .88]
+    for alpha in alpha_csts:
+        run_expe(expe_num=expe_num, alpha_cst=alpha, clean_log=clean_log)
 
-# if __name__ == "__main__":
-#     main()
+    return expe_num
\ No newline at end of file
-- 
GitLab