Scripts needed for automation of learning process ... Tested on Sypet benchmark ...
[satune.git] / src / Scripts / remotelearning.py
1 import re
2 import argparse
3 import sys
4 from threading import Thread
5 import subprocess
6 import os
7
8 # 1) Deploy on all the servers
9 # 2) Based on the benchmark selection, run each learning set on a server
10 # 3) After being done with that, it sshould calculate the first best 3
11 # 4) Run them indivisually
12 # 5) Generate the excel sheet!
13 SRCDIR="/scratch/hamed/constraint_compiler/src"
14 LOCALSRCDIR="/scratch/satcheck/satproject/constraint_compiler/src"
15 class ArgParser:
16     def __init__(self):
17         self.parser = argparse.ArgumentParser(description='Parsing the output log of the CSolver auto tuner ...')
18         self.parser.add_argument('--bench', '-b', metavar='sudoku', type=str, nargs=1,help='Benchmark that you want to learn on')
19         self.args = self.parser.parse_args()
20         
21     def getBenchmarkName(self):
22         return self.args.bench[0]
23        
24 def deploy():
25         os.system("cd ../; ./deploy-cs.sh")
26
27 def getServerNeeded(benchmark):
28         variable = ""
29         with open("./Benchmarks/" + benchmark + "/learn.sh") as f:
30                 line = f.readline()
31                 while "declare -a LearningSet=" not in line:
32                         line = f.readline()
33                 while ")" not in line:
34                         variable = variable + line
35                         line = f.readline()
36                 variable = variable + line
37         return variable.count("\"")/2
38
39 def getAvailableServerList(needed):
40         global SRCDIR
41         available = []
42         for i in range(4,12):
43                 print ("Checking availability for server " + str(i))
44                 HOST="dc-"+ str(i) + ".calit2.uci.edu"
45                 COMMAND="cd "+SRCDIR+"; python ./Scripts/serverstatus.py"
46                 ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
47                         shell=False,
48                         stdout=subprocess.PIPE,
49                         stderr=subprocess.PIPE)
50                 result = ssh.stdout.readlines()
51                 if result == []:
52                         error = ssh.stderr.readlines()
53                         print >>sys.stderr, "ERROR: %s" % error
54                 else:
55                         print ("Result of running serverStatus: ")
56                         print result
57                         if "AVAILABLE\n" in result:
58                                 available.append(i)
59                                 if len(available) >= needed:
60                                         break
61         return available
62
63 def startLearningProcess(benchmark, server, learningSet):
64         global SRCDIR
65         HOST="dc-"+ str(server) + ".calit2.uci.edu"
66         ALGORITHM = "2"
67         LOGFILE= benchmark + "-" + str(learningSet) + ".log"
68         print("Running benchmark " + benchmark + "(Set="+ str(learningSet)+") on server")
69         COMMAND=("cd "+SRCDIR+"; ./Scripts/learnresultgen.sh " +
70                 benchmark + " " + str(learningSet) + " " + ALGORITHM + " &> " + LOGFILE + "; mv *.csv ~/; echo 'SUCCESS'")
71         print("Calling the following command:\n" + COMMAND)
72         ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
73                 shell=False,
74                 stdout=subprocess.PIPE,
75                 stderr=subprocess.PIPE)
76         result = ssh.stdout.readlines()
77         if result == []:
78                 error = ssh.stderr.readlines()
79                 print >>sys.stderr, "ERROR: %s" % error
80         else:
81                 print ("Result of running serverStatus: ") 
82                 print result
83
84 def moveCSVFiles():
85         global LOCALSRCDIR
86         os.system("mv ~/*.csv "+ LOCALSRCDIR)
87
88
89 def main():
90         benchmark = ArgParser().getBenchmarkName()
91 #       print("Deploying on all the servers ...")
92 #       deploy()
93         serverNumber = getServerNeeded(benchmark)
94         print("Learning on " + benchmark + " needs " + str(serverNumber) + " servers.")
95         availableServers = getAvailableServerList(serverNumber)
96         print ("Available Server:" + str(availableServers))
97         if serverNumber > len(availableServers):
98                 print("Servers are busy. We don't have enough server available for learning ...")
99                 sys.exit(1)
100         try:
101                 threads = []
102                 for i in range(serverNumber):
103                         t = Thread(target=startLearningProcess, args=(benchmark, availableServers[i], i, ))
104                         t.start()
105                         threads.append(t)
106                 
107                 for t in threads:
108                         t.join()
109                 moveCSVFiles()
110         except:
111                 print("Exception in creating learning thread ...")
112                 sys.exit(1)
113
114
115
116 if __name__ == "__main__":
117         main()