diff --git a/wa/framework/execution.py b/wa/framework/execution.py index bd8f3bd2..4657028b 100644 --- a/wa/framework/execution.py +++ b/wa/framework/execution.py @@ -131,7 +131,8 @@ class ExecutionContext(object): if not self.job_queue: raise RuntimeError('No jobs to run') self.current_job = self.job_queue.pop(0) - self.current_job.output = init_job_output(self.run_output, self.current_job) + job_output = init_job_output(self.run_output, self.current_job) + self.current_job.set_output(job_output) self.update_job_state(self.current_job) self.tm.start() return self.current_job diff --git a/wa/framework/job.py b/wa/framework/job.py index 7b3e47c9..e1dfe3f7 100644 --- a/wa/framework/job.py +++ b/wa/framework/job.py @@ -1,4 +1,5 @@ import logging +from copy import copy from datetime import datetime from wa.framework import pluginloader, signal, instruments @@ -56,6 +57,10 @@ class Job(object): else: self.workload = self._workload_cache[self.id] + def set_output(self, output): + output.classifiers = copy(self.classifiers) + self.output = output + def initialize(self, context): self.logger.info('Initializing job {} [{}]'.format(self.id, self.iteration)) with signal.wrap('WORKLOAD_INITIALIZED', self, context): diff --git a/wa/framework/output.py b/wa/framework/output.py index da1bdab4..09fa2bbb 100644 --- a/wa/framework/output.py +++ b/wa/framework/output.py @@ -1,6 +1,7 @@ import logging import os import shutil +from collections import OrderedDict from copy import copy from datetime import datetime @@ -58,6 +59,19 @@ class Output(object): return [] return self.result.artifacts + @property + def classifiers(self): + if self.result is None: + return OrderedDict() + return self.result.classifiers + + @classifiers.setter + def classifiers(self, value): + if self.result is None: + msg ='Attempting to set classifiers before output has been set' + raise RuntimeError(msg) + self.result.classifiers = value + def __init__(self, path): self.basepath = path self.result = None @@ -240,6 +254,7 @@ class Result(object): instance.metrics = [Metric.from_pod(m) for m in pod['metrics']] instance.artifacts = [Artifact.from_pod(a) for a in pod['artifacts']] instance.events = [Event.from_pod(e) for e in pod['events']] + instance.classifiers = pod.get('classifiers', OrderedDict()) return instance def __init__(self): @@ -248,6 +263,7 @@ class Result(object): self.metrics = [] self.artifacts = [] self.events = [] + self.classifiers = OrderedDict() def add_metric(self, name, value, units=None, lower_is_better=False, classifiers=None): @@ -282,6 +298,7 @@ class Result(object): metrics=[m.to_pod() for m in self.metrics], artifacts=[a.to_pod() for a in self.artifacts], events=[e.to_pod() for e in self.events], + classifiers=copy(self.classifiers), )