Source code for benchbuild.reports.status
import csv
import os
import sqlalchemy as sa
import pandas as pd
from benchbuild.reports import Report
from benchbuild.experiment import ExperimentRegistry
[docs]class StatusReport(Report):
SUPPORTED_EXPERIMENTS = list(ExperimentRegistry.experiments.keys())
NAME = "status"
QUERY_STATUS = \
sa.sql.select([
sa.column('name'),
sa.column('_group'),
sa.column('status'),
sa.column('runs')
]).\
select_from(
sa.func.exp_status(sa.sql.bindparam('exp_ids'))
)
[docs] def report(self):
qry = StatusReport.\
QUERY_STATUS.unique_params(exp_ids=self.experiment_ids)
yield ("status",
('project', 'group', 'status', 'runs'),
self.session.execute(qry).fetchall())
[docs] def generate(self):
for name, header, data in self.report():
fname = os.path.basename(self.out_path)
fname = "{prefix}_{name}{ending}".format(
prefix=os.path.splitext(fname)[0],
ending=os.path.splitext(fname)[-1],
name=name)
with open(fname, 'w') as csv_out:
print("Writing '{0}'".format(csv_out.name))
csv_writer = csv.writer(csv_out)
csv_writer.writerows([header])
csv_writer.writerows(data)
[docs]class FullDump(Report):
"""Generate a dump of all rows associated with this experiment."""
SUPPORTED_EXPERIMENTS = list(ExperimentRegistry.experiments.keys())
NAME = "full"
[docs] def exp_name(self):
import benchbuild.utils.schema as s
exp_name = "multiple"
if len(self.experiment_ids) == 1:
q = self.session.query(s.Experiment)\
.filter(s.Experiment.id.in_(self.experiment_ids))\
.distinct()
exp_name = q.one().name
return exp_name
[docs] def report(self):
import benchbuild.utils.schema as s
tables = s.BASE.metadata.tables
required_tables = []
for _, table in tables.items():
if 'run_id' in table.columns and \
table.name != 'log':
required_tables.append(table)
run = tables['run']
joined = run
for table in required_tables:
joined = joined.outerjoin(
table, run.columns.id == table.c['run_id'])
joined = joined.select(use_labels=True).where(
run.columns.experiment_group.in_(
self.experiment_ids)
)
return pd.read_sql_query(
joined, self.session.connection(), chunksize=100)
[docs] def generate(self):
"""
Fetch all rows associated with this experiment.
This will generate a huge .csv.
"""
exp_name = self.exp_name()
fname = os.path.basename(self.out_path)
fname = "{exp}_{prefix}_{name}{ending}".format(
exp=exp_name,
prefix=os.path.splitext(fname)[0],
ending=os.path.splitext(fname)[-1],
name="full")
first = True
for chunk in self.report():
print("Writing chunk to :'{0}'".format(fname))
chunk.to_csv(fname, header=first, mode='a')
first = False