storing results in /rscratch instead of home dir
[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 /rscratch/hamed/; 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         availableServers = [4, 5, 6, 7]
97         print ("Available Server:" + str(availableServers))
98         if serverNumber > len(availableServers):
99                 print("Servers are busy. We don't have enough server available for learning ...")
100                 sys.exit(1)
101         try:
102                 threads = []
103                 for i in range(serverNumber):
104                         t = Thread(target=startLearningProcess, args=(benchmark, availableServers[i], i, ))
105                         t.start()
106                         threads.append(t)
107                 
108                 for t in threads:
109                         t.join()
110                 moveCSVFiles()
111         except:
112                 print("Exception in creating learning thread ...")
113                 sys.exit(1)
114
115
116
117 if __name__ == "__main__":
118         main()