Page MenuHomec4science

run.py
No OneTemporary

File Metadata

Created
Sat, Jun 8, 17:15
#!/usr/bin/env python
from __future__ import print_function
import job
import runconfig
import conffile
import sqlobject
import base
import sys
import bdparser as bdp
import re
import numpy as np
import datetime
class Run(sqlobject.SQLObject):
"""
"""
def attachToJob(self,job):
self["job_id"] = job.id
self.base.insert(self)
self.addConfigFile(self.execfile)
for cnffile in self.configfiles:
self.addConfigFile(cnffile)
def getExecFile(self):
return self.getUpdatedConfigFile(self.entries["exec"])
def addConfigFiles(self,file_list,regex_params=None):
self.prepare()
params_list = self.types.keys()
myjob = job.Job(self.base)
myjob.prepare()
params_list += myjob.types.keys()
#print (regex_params)
self.configfiles += [ conffile.addFile(fname,self.base,\
regex_params=regex_params,\
params=params_list) for fname in file_list]
return self.configfiles
def addConfigFile(self,configfile):
myrun_config = runconfig.RunConfig(self.base)
myrun_config.prepare()
myrun_config.attachToRun(self)
myrun_config.addConfigFile(configfile)
self.base.insert(myrun_config)
def getConfigFiles(self):
# myjob = job.Job(self.base)
# myjob["id"] = self.entries["job_id"]
# myjob = self.getMatchedObjectList()[0]
runconf = runconfig.RunConfig(self.base)
runconf["run_id"] = self.id
runconf_list = runconf.getMatchedObjectList()
conffiles = [self.getUpdatedConfigFile(f["configfile_id"]) for f in runconf_list]
return conffiles
def getConfigFile(self,file_id):
runconf = runconfig.RunConfig(self.base)
conf = conffile.ConfFile(self.base)
conf.prepare()
conf["id"] = file_id
conf = conf.getMatchedObjectList()[0]
return conf
def getUpdatedConfigFile(self,file_id):
conf = self.getConfigFile(file_id)
myjob = job.Job(self.base)
myjob.prepare()
myjob["id"] = self.entries["job_id"]
myjob = myjob.getMatchedObjectList()[0]
for key,val in myjob.entries.iteritems():
tmp = conf["file"].replace("__BLACKDYNAMITE__" + key + "__",str(val))
if ((not tmp == conf["file"]) and val is None):
raise Exception( "unset job parameter " + key)
conf["file"] = tmp
for key,val in self.entries.iteritems():
tmp = conf["file"].replace("__BLACKDYNAMITE__" + key + "__",str(val))
if ((not tmp == conf["file"]) and not val):
raise Exception( "unset run parameter " + key)
conf["file"] = tmp
conf["file"] = conf["file"].replace("__BLACKDYNAMITE__dbhost__",self.base.dbhost)
conf["file"] = conf["file"].replace("__BLACKDYNAMITE__study__",self.base.schema)
conf["file"] = conf["file"].replace("__BLACKDYNAMITE__run_id__",str(self.id))
return conf
def listQuantities(self):
request = "SELECT id,name FROM {0}.quantities WHERE (is_vector) = (false)".format(self.base.schema)
curs = self.base.performRequest(request)
all_quantities = [res[1] for res in curs]
return all_quantities
def getScalarQuantities(self,names,additional_request=None):
request = "SELECT id,name FROM {0}.quantities WHERE (is_vector) = (false)".format(self.base.schema)
params = []
if (names):
if (not type(names) == list):
names = [names]
request += " and ("
for name in names:
similar_op_match = re.match(r"\s*(~)\s*(.*)", name)
op = " = "
if (similar_op_match):
op = " ~ "
name = similar_op_match.group(2)
request += " name " + op + "%s or"
params.append(str(name))
request = request[:len(request)-3] + ")"
# print (request)
# print (params)
curs = self.base.performRequest(request,params)
quantities = [res[1] for res in curs]
if (len(quantities) == 0):
print ("No quantity matches " + str(names))
print ("Quantities declared in the database are \n" + "\n".join([res for res in self.listQuantities()]))
sys.exit(-1)
return None
try:
quant_indexes = [quantities.index(n) for n in names]
quantities = names
except:
quant_indexes = None
# print (quant)
results = []
for key in quantities:
q = self.getScalarQuantity(key,additional_request)
if (q is not None):
results.append([key,q])
print ("got Quantity " + str(key) + " : " + str(q.shape[0]) + " values")
return results
def getScalarQuantity(self,name,additional_request=None):
request = "SELECT id,is_integer FROM {0}.quantities WHERE (name,is_vector) = (%s,false)".format(self.base.schema)
curs = self.base.performRequest(request,[name])
item = curs.fetchone()
if (item is None):
raise Exception("unknown quantity \"" + name + "\"")
quantity_id = item[0]
is_integer = item[1]
request = "SELECT step,measurement from {0}.{1} WHERE (run_id,quantity_id) = ({2},{3})".format(self.base.schema,"scalar_real" if (is_integer == False) else "scalar_integer",self.id,quantity_id)
if (additional_request):
request += " and " + " and ".join(additional_request)
request += " ORDER BY step"
curs.execute(request,[name])
fetch = curs.fetchall()
if (not fetch):
return None
return (np.array([(val[0],val[1]) for val in fetch]))
def getVectorQuantity(self,name, step):
request = "SELECT id,is_integer FROM {0}.quantities WHERE (name,is_vector) = (%s,true)".format(self.base.schema)
curs = self.base.performRequest(request,[name])
item = curs.fetchone()
if (item is None):
raise Exception("unknown quantity \"" + name + "\"")
quantity_id = item[0]
is_integer = item[1]
request = "SELECT measurement from {0}.{1} WHERE (run_id,quantity_id,step) = ({2},{3},{4})".format(self.base.schema,"vector_real" if (is_integer == False) else "vector_integer",self.id,quantity_id,step)
curs.execute(request,[name])
fetch = curs.fetchone()
if (fetch):
return np.array(fetch[0])
return None
def getAllVectorQuantity(self,name):
request = "SELECT id,is_integer FROM {0}.quantities WHERE (name,is_vector) = (%s,true)".format(self.base.schema)
curs = self.base.performRequest(request,[name])
item = curs.fetchone()
if (item is None):
raise Exception("unknown quantity \"" + name + "\"")
quantity_id = item[0]
is_integer = item[1]
request = "SELECT step,measurement from {0}.{1} WHERE (run_id,quantity_id) = ({2},{3}) order by step".format(self.base.schema,"vector_real" if (is_integer == False) else "vector_integer",self.id,quantity_id)
curs.execute(request,[name])
fetch = curs.fetchall()
if (not fetch):
return None
matres = np.array([val[1] for val in fetch])
stepres = np.array([val[0] for val in fetch])
return (stepres,matres)
def __init__ (self,base):
sqlobject.SQLObject.__init__(self,base)
self.table_name = "runs"
self.foreign_keys["job_id"] = "jobs"
self.types["machine_name"] = str
self.types["run_path"] = str
self.allowNull["run_path"] = True
self.types["job_id"] = int
self.types["nproc"] = int
self.types["run_name"] = str
self.types["wait_id"] = int
self.allowNull["wait_id"] = True
self.types["start_time"] = datetime.datetime
self.allowNull["start_time"] = True
self.types["state"] = str
self.allowNull["state"] = True
self.execfile = None
self.configfiles = []
self.types["exec"] = str
################################################################

Event Timeline