Commit 58089657 authored by Jarrod Pas's avatar Jarrod Pas
Browse files

Updates ShedTrace to inherit from Trace class

parent 74d01f92
......@@ -3,7 +3,7 @@
__all__ = [
'write_meta_file',
'read_meta_file',
'shed_trace',
'ShedTrace',
]
__author__ = 'Jarrod Pas <j.pas@usask.ca>'
......@@ -15,7 +15,7 @@ from collections import defaultdict
from itertools import groupby, count
from os import path
from pydtn import Contact
from pydtn import Trace
def write_meta_file(meta_path, csv_path, duty_cycle_length=300):
......@@ -56,9 +56,32 @@ def read_meta_file(meta_path):
raise RuntimeError('Should not get here...')
def _get_contact_pairs(csv_path):
class ShedTrace(Trace):
"""Generator for contact traces from duty cycle based SHED datasets."""
def __init__(self, meta_path):
"""
Create SHED trace generator.
Arguments:
meta_path -- path to a metadata file created with `write_meta_file`
"""
self.path = meta_path
self.meta = read_meta_file(meta_path)
super().__init__(self.meta['nodes'])
self._pairs = None
self._contacts = None
@property
def contact_pairs(self):
"""Return all pairs and their duty cycles that they are in contact."""
if self._pairs is not None:
return self._pairs
pairs = defaultdict(set)
with open(csv_path) as csv_file:
with open(self.meta['data']) as csv_file:
csv_file = csv.reader(csv_file)
next(csv_file)
for row in csv_file:
......@@ -66,22 +89,26 @@ def _get_contact_pairs(csv_path):
pair = min(source, target), max(source, target)
slot = int(slot)
pairs[pair].add(slot)
return dict(pairs)
self._pairs = dict(pairs)
return self._pairs
def shed_trace(meta_path):
@property
def contacts(self):
"""
Generate contact trace for a duty cycle based SHED dataset.
Calculate contacts in the SHED dataset.
Keyword Arguments:
duty_cycle_length -- duration of each duty cycle (default 300)
Computes contacts by finding consecutive duty cycles that any give pair
of nodes saw each other. The end of each contact is at the start of
the duty cycle that they did not see each other.
"""
meta = read_meta_file(meta_path)
pairs = _get_contact_pairs(meta['data'])
if self._contacts is not None:
return self._contacts
node = count()
nodes = {}
contacts = []
for (source, target), slots in pairs.items():
for (source, target), slots in self.contact_pairs.items():
# get canonical node id for source
if source not in nodes:
nodes[source] = next(node)
......@@ -99,10 +126,18 @@ def shed_trace(meta_path):
# [1, 2, 3, 6, 7, 9] -> [-1, -1, -1, -3, -3, -4]
for _, group in groupby(enumerate(slots), lambda p: p[0]-p[1]):
times = list(map(lambda g: g[1], group))
start = times[0] * meta['duty_cycle_length']
end = (times[-1] + 1) * meta['duty_cycle_length']
start = times[0] * self.meta['duty_cycle_length']
end = (times[-1] + 1) * self.meta['duty_cycle_length']
contacts.extend([
self.create_contact(start, source, target, True),
self.create_contact(end, source, target, False),
])
contacts.append(Contact(start, source, target, True))
contacts.append(Contact(end, source, target, False))
contacts.sort()
self._contacts = contacts
return self._contacts
yield from sorted(contacts)
def __iter__(self):
"""Yield contacts in SHED dataset."""
yield from self.contacts
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment