Formatters done, not necessarily fast enough though

git-svn-id: https://bucket.mit.edu/svn/nilm/nilmdb@10889 ddd99763-3ecb-0310-9145-efcb8ce7c51f
This commit is contained in:
Jim Paris 2012-05-25 19:02:58 +00:00
parent e2daeb5e54
commit 11cc124019
2 changed files with 63 additions and 35 deletions

View File

@ -30,7 +30,10 @@ class Layout:
return tables.Description(desc)
def parse(self, char *text):
raise ParserError("no parser for this layout")
raise ParserError("n/a", "no parser for this layout")
def format(self, char *text):
raise FormatterError("no formatter for this layout")
class PrepData(Layout):
rate_hz = 120
@ -58,6 +61,13 @@ class PrepData(Layout):
raise ValueError("wrong number of values: wanted 9, got " + str(n))
return (ts, [ts, v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]])
def format(self, d):
n = len(d)
if n != 9:
raise ValueError("wrong number of values: wanted 9, got " + str(n))
return ("%.6f %f %f %f %f %f %f %f %f\n" %
(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8]))
class RawData(Layout):
rate_hz = 8000
fields = [ ( 'timestamp', 'float64' ),
@ -83,6 +93,13 @@ class RawData(Layout):
raise ValueError("value out of range: " + str(v[i]))
return (ts, [ts, v[0], v[1], v[2], v[3], v[4], v[5]])
def format(self, d):
n = len(d)
if n != 7:
raise ValueError("wrong number of values: wanted 7, got " + str(n))
return ("%.6f %d %d %d %d %d %d\n" %
(d[0], d[1], d[2], d[3], d[4], d[5], d[6]))
class RawNotchedData(RawData):
rate_hz = 8000
fields = RawData.fields + [
@ -105,6 +122,13 @@ class RawNotchedData(RawData):
raise ValueError("value out of range: " + str(v[i]))
return (ts, [ts, v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8]])
def format(self, d):
n = len(d)
if n != 10:
raise ValueError("wrong number of values: wanted 10, got " + str(n))
return ("%.6f %d %d %d %d %d %d %d %d %d\n" %
(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9]))
# Instantiate all layouts, indexed by their name
named = {}
for name, obj in inspect.getmembers(sys.modules[__name__]):

View File

@ -123,8 +123,10 @@ class TestLayouts(object):
[ 1234567890.100000, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 ] ]
text = formatter.format(data)
eq_(text,
"1234567890.000000 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8\n" +
"1234567890.100000 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8\n")
"1234567890.000000 1.100000 2.200000 3.300000 4.400000 " +
"5.500000 6.600000 7.700000 8.800000\n" +
"1234567890.100000 1.100000 2.200000 3.300000 4.400000 " +
"5.500000 6.600000 7.700000 8.800000\n")
# try RawData too
formatter = Formatter("RawData")
@ -151,38 +153,40 @@ class TestLayouts(object):
eq_(text, "")
def test_roundtrip(self):
# Verify that textual data passed into the Parser and then
# back through the Formatter comes out the same way.
# Verify that textual data passed into the Parser, and then
# back through the Formatter, then back into the Parser,
# gives identical parsed representations
random.seed(12345)
# Roundtrip PrepData
for i in range(1000):
rows = random.randint(1,100)
data = ""
ts = 1234567890
for r in range(rows):
ts += random.uniform(0,1)
row = sprintf("%f", ts)
for f in range(8):
row += sprintf(" %f", random.uniform(-1000,1000))
data += row + "\n"
parser = Parser("PrepData")
formatter = Formatter("PrepData")
parser.parse(data)
eq_(formatter.format(parser.data), data)
def do_roundtrip(layout, datagen):
for i in range(100):
rows = random.randint(1,100)
data = ""
ts = 1234567890
for r in range(rows):
ts += random.uniform(0,1)
row = sprintf("%f", ts) + " "
row += " ".join(datagen())
row += "\n"
data += row
parser1 = Parser(layout)
formatter = Formatter(layout)
parser2 = Parser(layout)
parser1.parse(data)
parser2.parse(formatter.format(parser1.data))
eq_(parser1.data, parser2.data)
# Roundtrip RawData
for i in range(1000):
rows = random.randint(1,100)
data = ""
ts = 1234567890
for r in range(rows):
ts += random.uniform(0,1)
row = sprintf("%f", ts)
for f in range(8):
row += sprintf(" %d", random.randint(0,65535))
data += row + "\n"
parser = Parser("RawData")
formatter = Formatter("RawData")
parser.parse(data)
eq_(formatter.format(parser.data), data)
def datagen():
return [ sprintf("%f", random.uniform(-1000,1000))
for x in range(8) ]
do_roundtrip("PrepData", datagen)
def datagen():
return [ sprintf("%d", random.randint(0,65535))
for x in range(6) ]
do_roundtrip("RawData", datagen)
def datagen():
return [ sprintf("%d", random.randint(0,65535))
for x in range(9) ]
do_roundtrip("RawNotchedData", datagen)