import subprocess,sys,re,os,time,errno
from threading import Thread
import My_Logger
from django.conf import settings
class Experiment():
#sim_rltb_d1_r2_wf_3a_2r_4min_16max_0p_60l_4cl_8000sth_2835meas
def __init__(self, install_dir, pid_file, iterations, *args):
for arg in args:
self.install_dir_root = install_dir
self.install_dir = install_dir+"/exp_"+pid_file
self.pid_file = pid_file
self.parameters = arg
self.refreshLogs(self.parameters.split('_')[2])
self.generateCoorPropFile(str(1))
workerThread = Thread(target = self.run_experiment)
workerThread.start()
# for i in range(1,int(iterations)+1):
# self.refreshLogs(self.parameters.split('_')[2])
# self.generateCoorPropFile(str(i))
# workerThread = Thread(target = self.run_experiment)
# workerThread.start()
# time.sleep(15)
# #self.experiment_log = My_Logger.My_Logger(self.install_dir+'/Coordinator_'+self.pid_file+'.properties');
##temp change turn [14] to [13]
# #time.sleep(5)
# while self.isItRunning(i,int(self.parameters.split('_')[12].replace('meas',''))):
# time.sleep(15)
def isItRunning(self,i,meas_count):
proc = subprocess.Popen('wc -l '+self.install_dir+'/sim_'+ self.pid_file +"/"+self.parameters+'_exp_logs_'+'/'+self.parameters+'_exp_logs_'+str(i)+'iter/measurements.log', stdout=subprocess.PIPE, shell=True);
(out, err) = proc.communicate()
proc = subprocess.Popen('wc -l '+self.install_dir+'/sim_'+ self.pid_file +"/"+self.parameters+'_exp_logs_'+'/'+self.parameters+'_exp_logs_'+str(i)+'iter/discarded_measurements.log', stdout=subprocess.PIPE, shell=True);
(out2, err2) = proc.communicate()
if (out == '' and out2 == ''):
return True
return ( int( int(out.split(' ')[0]) + int(out2.split(' ')[0]) ) < int(meas_count))
def run_experiment(self):
# kill previous deamon
try:
time.sleep(5)
pf = file(self.pid_file,'r')
pid = pf.read().strip()
pf.close()
os.system('kill -9 ' + str(pid))
os.remove(self.pid_file)
except IOError:
pid = None
time.sleep(5)
os.system('python '+self.install_dir_root+'/Coordinator.py start ' + self.pid_file + ' ' + self.install_dir+'/Coordinator_'+self.pid_file+'.properties')
def refreshLogs(self,data_set):
if os.path.exists(self.install_dir+"/logs_" + self.pid_file):
os.system('rm -R '+self.install_dir+"/logs_" + self.pid_file)
self.mkdir_p(self.install_dir+"/logs_" + self.pid_file)
os.system('cp '+self.install_dir_root+'/templates/experiments/training/'+data_set+'/measurements.txt '+self.install_dir+"/logs_" + self.pid_file+'/')
def file_len(self,fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
def generateCoorPropFile(self, iteration_num):
expSplit = self.parameters.split('_')
SIMULATION_VAR = 'True' if expSplit[0] == 'sim' else 'False'
if expSplit[1] == 'rltb':
POLICY_VAR = 'RL-TB'
elif expSplit[1] == 'mdptb':
POLICY_VAR = 'MDP-TB'
elif expSplit[1] == 'mdpeb':
POLICY_VAR = 'MDP-EB'
elif expSplit[1] == 'mdpebg':
POLICY_VAR = 'MDP-EBG'
elif expSplit[1] == 'mdp2':
POLICY_VAR = 'MDP2'
elif expSplit[1] == 'mdp2attack':
POLICY_VAR = 'MDP2attack'
elif expSplit[1] == 'mdp3':
POLICY_VAR = 'MDP3'
elif expSplit[1] == 're':
POLICY_VAR = 'RE'
elif expSplit[1] == 'mdp2mat':
POLICY_VAR = 'MDP2-MAT'
TRAINING_SET_NAME_VAR = expSplit[2]
TRAINING_SET_LENGTH = str(self.file_len(self.install_dir_root+'/templates/experiments/training/'+expSplit[2]+'/measurements.txt'))
REWARD_FUNCTION_NAME_VAR = expSplit[3]
PUNISHMENT = expSplit[21].replace('pun','')
WEIGHTEDREWARD = "False"
if expSplit[3] == 'r1':
GAIN_VAR = 'throughput/num_nodes'
elif expSplit[3] == 'r3':
GAIN_VAR = 'max_num_nodes-num_nodes+1'
elif expSplit[3] == 'r4':
GAIN_VAR = '1.0-(1.0/num_nodes)'
elif expSplit[3] == 'r42':
GAIN_VAR = '2.0-(2.0/(1+norm_total_cost))'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r2':
GAIN_VAR = '1.0/num_nodes'
elif expSplit[3] == 'r5':
GAIN_VAR = '(0.5*norm_total_cost+0.5*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r6':
GAIN_VAR = '(0.4*norm_total_cost+0.6*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r7':
GAIN_VAR = '(0.3*norm_total_cost+0.7*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r8':
GAIN_VAR = '(0.2*norm_total_cost+0.8*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r9':
GAIN_VAR = '(0.1*norm_total_cost+0.9*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r10':
GAIN_VAR = '(0.0*norm_total_cost+1.0*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r11':
GAIN_VAR = '(0.35*norm_total_cost+0.65*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r12':
GAIN_VAR = '(0.6*norm_total_cost+0.4*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r13':
GAIN_VAR = '(0.7*norm_total_cost+0.3*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r14':
GAIN_VAR = '(0.8*norm_total_cost+0.2*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r15':
GAIN_VAR = '(0.9*norm_total_cost+0.1*norm_latency)'
WEIGHTEDREWARD = "True"
elif expSplit[3] == 'r16':
GAIN_VAR = '(1.0*norm_total_cost+0.0*norm_latency)'
WEIGHTEDREWARD = "True"
if expSplit[4] == 'wt':
WINDOW_VAR = 'True'
EWMA_VAR = 'False'
elif expSplit[4] == 'ewmat':
WINDOW_VAR = 'False'
EWMA_VAR = 'True'
elif expSplit[4] == 'wf':
WINDOW_VAR = 'False'
EWMA_VAR = 'False'
ADD_VAR = expSplit[5].replace('a','')
REM_VAR = expSplit[6].replace('r','')
INIT_VAR = expSplit[7].replace('init','')
MIN_VAR = expSplit[8].replace('min','')
MAX_VAR = expSplit[9].replace('max','')
LATENCY_VAR = expSplit[10].replace('l','')
CLUSTERS_VAR = expSplit[11].replace('cl','')
MEAS_COUNT_VAR = expSplit[12].replace('meas','')
MAXSTEPS = expSplit[13].replace('steps','') #[number of steps (0 for no steps)]
CUMULATIVE = expSplit[14].replace('Cum','') #[True/False]
VIOLATIONCLUSTER = expSplit[15].replace('Viocl','') #[True/False]
ATTACK = expSplit[16].replace('Attack','')
TRANSIENTCOUNTER = expSplit[17].replace('trancnt','')
POLICYCASE = expSplit[18]
ACCEPTANCEPERC = expSplit[19].replace('ap','')
HOURLY = expSplit[20].replace('Hourly','')
PRISM_PATH_VAR = os.path.join(settings.BASE_DIR, 'prism-4.3-linux64')+'/bin/prism'
PRISM_MULTI_PATH_VAR = '/root/prism-games-steering_gurobi/prism-games-steering/prism/bin/prism'
PRISM_OUTPUT_FOLDER = 'prism_output_'+self.pid_file
SPOTPRICEDB = self.install_dir_root+'/spot_prices.db'
LOAD_MEAS_LOG = self.install_dir_root+'/templates/experiments/training/'+TRAINING_SET_NAME_VAR+'/measurements.txt'
LOAD_FILE_VAR = self.install_dir_root+'/templates/experiments/load/'+TRAINING_SET_NAME_VAR+'/'+TRAINING_SET_NAME_VAR+'_iter_'+str(iteration_num)
PRODUCE_NEW_INLAMBDA_VAR = 'False'
ITERATION_VAR = iteration_num
coor_prop_ifile = open(self.install_dir_root+'/templates/experiments/Coordinator.properties', 'r')
coor_prop = coor_prop_ifile.read()
coor_prop_ifile.close()
LOGS = "logs_"+ self.pid_file
coor_prop = re.sub('LOGS',LOGS,coor_prop)
coor_prop = re.sub('SIMULATION_VAR',SIMULATION_VAR,coor_prop)
coor_prop = re.sub('TRAINING_SET_NAME_VAR',TRAINING_SET_NAME_VAR,coor_prop)
coor_prop = re.sub('TRAINING_SET_LENGTH',TRAINING_SET_LENGTH,coor_prop)
coor_prop = re.sub('REWARD_FUNCTION_NAME_VAR',REWARD_FUNCTION_NAME_VAR,coor_prop)
coor_prop = re.sub('GAIN_VAR',GAIN_VAR,coor_prop)
coor_prop = re.sub('PUNISHMENT',PUNISHMENT,coor_prop)
coor_prop = re.sub('WEIGHTEDREWARD',WEIGHTEDREWARD,coor_prop)
coor_prop = re.sub('WINDOW_VAR',WINDOW_VAR,coor_prop)
coor_prop = re.sub('EWMA_VAR',EWMA_VAR,coor_prop)
coor_prop = re.sub('ADD_VAR',ADD_VAR,coor_prop)
coor_prop = re.sub('REM_VAR',REM_VAR,coor_prop)
coor_prop = re.sub('INIT_VAR',INIT_VAR,coor_prop)
coor_prop = re.sub('MIN_VAR',MIN_VAR,coor_prop)
coor_prop = re.sub('MAX_VAR',MAX_VAR,coor_prop)
# coor_prop = re.sub('ACCEPTED_PERCENTAGE_VAR',ACCEPTED_PERCENTAGE_VAR,coor_prop)
coor_prop = re.sub('LATENCY_VAR',LATENCY_VAR,coor_prop)
coor_prop = re.sub('CLUSTERS_VAR',CLUSTERS_VAR,coor_prop)
# coor_prop = re.sub('SERVER_THROUGHPUT_VAR',SERVER_THROUGHPUT_VAR,coor_prop)
coor_prop = re.sub('MEAS_COUNT_VAR',MEAS_COUNT_VAR,coor_prop)
coor_prop = re.sub('PRISM_PATH_VAR',PRISM_PATH_VAR,coor_prop)
coor_prop = re.sub('PRISM_MULTI_PATH_VAR',PRISM_MULTI_PATH_VAR,coor_prop)
coor_prop = re.sub('PRISM_OUTPUT_FOLDER',PRISM_OUTPUT_FOLDER,coor_prop)
coor_prop = re.sub('SPOTPRICEDB',SPOTPRICEDB,coor_prop)
coor_prop = re.sub('LOAD_MEAS_LOG',LOAD_MEAS_LOG,coor_prop)
coor_prop = re.sub('LOAD_FILE_VAR',LOAD_FILE_VAR,coor_prop)
coor_prop = re.sub('PRODUCE_NEW_INLAMBDA_VAR',PRODUCE_NEW_INLAMBDA_VAR,coor_prop)
coor_prop = re.sub('ITERATION_VAR',ITERATION_VAR,coor_prop)
coor_prop = re.sub('POLICY_VAR',POLICY_VAR,coor_prop)
coor_prop = re.sub('POLICYCASE',POLICYCASE,coor_prop)
coor_prop = re.sub('ACCEPTANCEPERC',ACCEPTANCEPERC,coor_prop)
coor_prop = re.sub('HOURLY',HOURLY,coor_prop)
coor_prop = re.sub('INSTALL_DIR',self.install_dir,coor_prop)
# coor_prop = re.sub('ADDWAITTIME',ADDWAITTIME,coor_prop)
# coor_prop = re.sub('REMOVEWAITTIME',REMOVEWAITTIME,coor_prop)
# coor_prop = re.sub('ADDFAILUREPROB',ADDFAILUREPROB,coor_prop)
# coor_prop = re.sub('REMOVEFAILUREPROB',REMOVEFAILUREPROB,coor_prop)
# coor_prop = re.sub('FAILUREALPHACONST',FAILUREALPHACONST,coor_prop)
# coor_prop = re.sub('FAILUREBETACONST',FAILUREBETACONST,coor_prop)
# coor_prop = re.sub('ALPHA',ALPHA,coor_prop)
# coor_prop = re.sub('MODELTYPE',MODELTYPE,coor_prop)
# coor_prop = re.sub('REWARDSTRUCTURE',REWARDSTRUCTURE,coor_prop)
# coor_prop = re.sub('ACTIONSELECTIONTYPE',ACTIONSELECTIONTYPE,coor_prop)
# coor_prop = re.sub('FAULTPROBS',FAULTPROBS,coor_prop)
# coor_prop = re.sub('SMGSTRATEGY',SMGSTRATEGY,coor_prop)
coor_prop = re.sub('MAXSTEPS',MAXSTEPS,coor_prop)
# coor_prop = re.sub('REWARDNORMALIZATION',REWARDNORMALIZATION,coor_prop)
coor_prop = re.sub('CUMULATIVE',CUMULATIVE,coor_prop)
coor_prop = re.sub('VIOLATIONCLUSTER',VIOLATIONCLUSTER,coor_prop)
coor_prop = re.sub('ATTACK',ATTACK,coor_prop)
coor_prop = re.sub('TRANSIENTCOUNTER',TRANSIENTCOUNTER,coor_prop)
coor_prop_ofile = open(self.install_dir+'/Coordinator_'+self.pid_file+'.properties', 'w')
coor_prop_ofile.write(coor_prop)
coor_prop_ofile.close()
def mkdir_p(self,path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else: raise
if __name__ == '__main__':
#nohup python Experiments.py /home/thanasis/Desktop/tiramola_mdp_real_sim_controller sim_test 1 sim_mdp2_gfpl_r1_wf_3a_2r_4min_14max_20addwait_10remwait_60l_3cl_8000sth_3144meas_FalseFaults_0.01addfp_0.001remfp_1.1sima_1.02simb_mdp_fast_max_0steps_s_FalseCum_TrueNorm_0.2ra_0p_FalseViocl_TruePre_10prstep &
exp = Experiment(sys.argv[1],sys.argv[2],*sys.argv[3:])