mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-03-21 10:09:02 +00:00
Added 'negative_values' to daq instrument which can be used to specify how negative values in the samples should be handled.
This commit is contained in:
parent
94cc17271e
commit
6d6cddff58
@ -19,6 +19,8 @@ from __future__ import division
|
||||
import os
|
||||
import sys
|
||||
import csv
|
||||
import shutil
|
||||
import tempfile
|
||||
from collections import OrderedDict
|
||||
from multiprocessing import Process, Queue
|
||||
|
||||
@ -130,7 +132,20 @@ class Daq(Instrument):
|
||||
global_alias='daq_labels',
|
||||
description='List of port labels. If specified, the lenght of the list must match '
|
||||
'the length of ``resistor_values``. Defaults to "PORT_<pnum>", where '
|
||||
'"pnum" is the number of the port.')
|
||||
'"pnum" is the number of the port.'),
|
||||
Parameter('negative_samples', default='keep', allowed_values=['keep', 'zero', 'drop', 'abs'],
|
||||
global_alias='daq_negative_samples',
|
||||
description="""
|
||||
Specifies how negative power samples should be handled. The following
|
||||
methods are possible:
|
||||
|
||||
:keep: keep them as they are
|
||||
:zero: turn negative values to zero
|
||||
:drop: drop samples if they contain negative values. *warning:* this may result in
|
||||
port files containing different numbers of samples
|
||||
:abs: take the absoulte value of negave samples
|
||||
|
||||
"""),
|
||||
]
|
||||
|
||||
def initialize(self, context):
|
||||
@ -165,11 +180,29 @@ class Daq(Instrument):
|
||||
key = (context.spec.id, context.workload.name, context.current_iteration)
|
||||
if key not in self._results:
|
||||
self._results[key] = {}
|
||||
|
||||
temp_file = os.path.join(tempfile.gettempdir(), entry)
|
||||
writer, wfh = None, None
|
||||
|
||||
with open(path) as fh:
|
||||
if self.negative_samples != 'keep':
|
||||
wfh = open(temp_file, 'wb')
|
||||
writer = csv.writer(wfh)
|
||||
|
||||
reader = csv.reader(fh)
|
||||
metrics = reader.next()
|
||||
if writer:
|
||||
writer.writerow(metrics)
|
||||
self._metrics |= set(metrics)
|
||||
data = [map(float, d) for d in zip(*list(reader))]
|
||||
|
||||
rows = _get_rows(reader, writer, self.negative_samples)
|
||||
#data = [map(float, d) for d in zip(*rows)]
|
||||
data = zip(*rows)
|
||||
|
||||
if writer:
|
||||
wfh.close()
|
||||
shutil.move(temp_file, os.path.join(output_directory, entry))
|
||||
|
||||
n = len(data[0])
|
||||
means = [s / n for s in map(sum, data)]
|
||||
for metric, value in zip(metrics, means):
|
||||
@ -243,3 +276,25 @@ class Daq(Instrument):
|
||||
def _send_daq_command(q, *args, **kwargs):
|
||||
result = daq.execute_command(*args, **kwargs)
|
||||
q.put(result)
|
||||
|
||||
|
||||
def _get_rows(reader, writer, negative_samples):
|
||||
rows = []
|
||||
for row in reader:
|
||||
row = map(float, row)
|
||||
if negative_samples == 'keep':
|
||||
rows.append(row)
|
||||
elif negative_samples == 'zero':
|
||||
def nonneg(v):
|
||||
return v if v >= 0 else 0
|
||||
rows.append([nonneg(v) for v in row])
|
||||
elif negative_samples == 'drop':
|
||||
if all(v >= 0 for v in row):
|
||||
rows.append(row)
|
||||
elif negative_samples == 'abs':
|
||||
rows.append([abs(v) for v in row])
|
||||
else:
|
||||
raise AssertionError(negative_samples) # should never get here
|
||||
if writer:
|
||||
writer.writerow(row)
|
||||
return rows
|
||||
|
Loading…
x
Reference in New Issue
Block a user