Skip to content
Snippets Groups Projects
Commit 2ae8fd50 authored by jlaura's avatar jlaura Committed by GitHub
Browse files

Merge pull request #7 from jlaura/master

Rollsback the move from dataframe to graph cnet
parents ee4b1af9 3307cc8d
No related branches found
No related tags found
No related merge requests found
...@@ -145,7 +145,7 @@ class IsisStore(object): ...@@ -145,7 +145,7 @@ class IsisStore(object):
self._path = path self._path = path
if not mode: if not mode:
mode = 'wb' # pragma: no cover mode = 'a' # pragma: no cover
self._mode = mode self._mode = mode
self._handle = None self._handle = None
...@@ -170,13 +170,13 @@ class IsisStore(object): ...@@ -170,13 +170,13 @@ class IsisStore(object):
self._handle.seek(offset) self._handle.seek(offset)
self._handle.write(data) self._handle.write(data)
def create_points(self, graphs, pointid_prefix, pointid_suffix): def create_points(self, obj, pointid_prefix, pointid_suffix):
""" """
Step through a control network (C) and return protocol buffer point objects Step through a control network (C) and return protocol buffer point objects
Parameters Parameters
---------- ----------
graphs : list obj : list
of iterable objects (dataframes) with the appropriate of iterable objects (dataframes) with the appropriate
attributes: point_id, point_type, serial, measure_type, x, y required. attributes: point_id, point_type, serial, measure_type, x, y required.
The entries in the list must support grouping by the point_id attribute. The entries in the list must support grouping by the point_id attribute.
...@@ -197,21 +197,20 @@ class IsisStore(object): ...@@ -197,21 +197,20 @@ class IsisStore(object):
# TODO: Rewrite using apply syntax for performance # TODO: Rewrite using apply syntax for performance
point_sizes = [] point_sizes = []
point_messages = [] point_messages = []
for graph in graphs: for df in obj:
for i, control_point_id in enumerate(graph.point_nodes): for i, g in df.groupby('point_id'):
control_point = graph.node[control_point_id]
point_spec = cnf.ControlPointFileEntryV0002() point_spec = cnf.ControlPointFileEntryV0002()
point_spec.id = _set_pid(control_point['pointid']) point_spec.id = _set_pid(self.pointid)
for attr, attrtype in self.point_attrs: for attr, attrtype in self.point_attrs:
if attr in control_point.keys(): if attr in g.columns:
# As per protobuf docs for assigning to a repeated field. # As per protobuf docs for assigning to a repeated field.
if attr == 'aprioriCovar': if attr == 'aprioriCovar':
arr = control_point['aprioriCovar'] arr = g.iloc[0]['aprioriCovar']
point_spec.aprioriCovar.extend(arr.ravel().tolist()) point_spec.aprioriCovar.extend(arr.ravel().tolist())
else: else:
# The third argument casts the value to the correct type setattr(point_spec, attr, attrtype(g.iloc[0][attr]))
setattr(point_spec, attr, attrtype(control_point[attr])) point_spec.type = int(g.point_type.iat[0])
point_spec.type = int(control_point.get('point_type', 2))
# The reference index should always be the image with the lowest index # The reference index should always be the image with the lowest index
point_spec.referenceIndex = 0 point_spec.referenceIndex = 0
...@@ -219,19 +218,16 @@ class IsisStore(object): ...@@ -219,19 +218,16 @@ class IsisStore(object):
# A single extend call is cheaper than many add calls to pack points # A single extend call is cheaper than many add calls to pack points
measure_iterable = [] measure_iterable = []
for j, control_measure_id in graph.edges(control_point_id): for node_id, m in g.iterrows():
control_measure = graph.node[control_measure_id]
if control_measure['node_type'] != 'correspondence':
continue
measure_spec = point_spec.Measure() measure_spec = point_spec.Measure()
# For all of the attributes, set if they are an dict accessible attr of the obj. # For all of the attributes, set if they are an dict accessible attr of the obj.
for attr, attrtype in self.measure_attrs: for attr, attrtype in self.measure_attrs:
if attr in control_measure.keys():
setattr(measure_spec, attr, attrtype(control_measure[attr]))
measure_spec.type = int(control_measure['measure_type']) if attr in g.columns:
measure_spec.line = float(control_measure['y']) setattr(measure_spec, attr, attrtype(m[attr]))
measure_spec.sample = float(control_measure['x']) measure_spec.type = int(m.measure_type)
measure_spec.line = m.y
measure_spec.sample = m.x
measure_iterable.append(measure_spec) measure_iterable.append(measure_spec)
self.nmeasures += 1 self.nmeasures += 1
point_spec.measures.extend(measure_iterable) point_spec.measures.extend(measure_iterable)
......
...@@ -3,7 +3,6 @@ import sys ...@@ -3,7 +3,6 @@ import sys
import unittest import unittest
from time import strftime, gmtime from time import strftime, gmtime
import networkx as nx
import pandas as pd import pandas as pd
import pvl import pvl
...@@ -24,35 +23,40 @@ class TestWriteIsisControlNetwork(unittest.TestCase): ...@@ -24,35 +23,40 @@ class TestWriteIsisControlNetwork(unittest.TestCase):
cls.serials = ['APOLLO15/METRIC/{}'.format(i) for i in serial_times.values()] cls.serials = ['APOLLO15/METRIC/{}'.format(i) for i in serial_times.values()]
columns = ['point_id', 'point_type', 'serialnumber', 'measure_type', 'x', 'y', 'node_id'] columns = ['point_id', 'point_type', 'serialnumber', 'measure_type', 'x', 'y', 'node_id']
G = nx.Graph() data = []
G.add_node(0, node_type='image')
G.add_node(1, node_type='image')
G.add_edge(0,1)
G.point_nodes = []
for i in range(cls.npts): for i in range(cls.npts):
i += 1 data.append((i, 2, cls.serials[0], 2, 0, 0, 0))
G.point_nodes.append(i*100) data.append((i, 2, cls.serials[1], 2, 0, 0, 1))
G.add_node(i * 100, node_type='point', pointid = i * 100, subpixel=False)
G.add_edge(i*100, 0)
G.add_edge(i*100, 1)
# Add a single correspondence
G.add_node(i * 1000, x=i*.5, y=i*.5, id=i*1000, node_type='correspondence', measure_type=2, serialnumber=cls.serials[0])
G.add_edge(i*1000, i*100)
# Add a second correspondence
G.add_node(i * 2000, x=i*.5, y=i*.5, id=i*2000, node_type='correspondence', measure_type=2, serialnumber=cls.serials[1])
G.add_edge(i * 2000, i*100)
dfs = [pd.DataFrame(data, columns=columns)]
cls.creation_date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) cls.creation_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
cls.modified_date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) cls.modified_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
io_controlnetwork.to_isis('test.net', [G], mode='wb', targetname='Moon') io_controlnetwork.to_isis('test.net', dfs, mode='wb', targetname='Moon')
cls.header_message_size = 78 cls.header_message_size = 78
cls.point_start_byte = 65614 # 66949 cls.point_start_byte = 65614 # 66949
def test_create_buffer_header(self): def test_create_buffer_header(self):
self.npts = 5
serial_times = {295: '1971-07-31T01:24:11.754',
296: '1971-07-31T01:24:36.970'}
self.serials = ['APOLLO15/METRIC/{}'.format(i) for i in serial_times.values()]
columns = ['point_id', 'point_type', 'serialnumber', 'measure_type', 'x', 'y', 'node_id']
data = []
for i in range(self.npts):
data.append((i, 2, self.serials[0], 2, 0, 0, 0))
data.append((i, 2, self.serials[1], 2, 0, 0, 1))
dfs = [pd.DataFrame(data, columns=columns)]
self.creation_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
self.modified_date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
io_controlnetwork.to_isis('test.net', dfs, mode='wb', targetname='Moon')
self.header_message_size = 78 self.header_message_size = 78
self.point_start_byte = 66104 # 66949 self.point_start_byte = 65614 # 66949
with open('test.net', 'rb') as f: with open('test.net', 'rb') as f:
f.seek(io_controlnetwork.HEADERSTARTBYTE) f.seek(io_controlnetwork.HEADERSTARTBYTE)
...@@ -69,16 +73,17 @@ class TestWriteIsisControlNetwork(unittest.TestCase): ...@@ -69,16 +73,17 @@ class TestWriteIsisControlNetwork(unittest.TestCase):
self.assertEqual('None', header_protocol.description) self.assertEqual('None', header_protocol.description)
self.assertEqual(self.modified_date, header_protocol.lastModified) self.assertEqual(self.modified_date, header_protocol.lastModified)
#Repeating #Repeating
self.assertEqual([137] * self.npts, header_protocol.pointMessageSizes) self.assertEqual([135] * self.npts, header_protocol.pointMessageSizes)
def test_create_point(self): def test_create_point(self):
with open('test.net', 'rb') as f: with open('test.net', 'rb') as f:
f.seek(self.point_start_byte) f.seek(self.point_start_byte)
for i, length in enumerate(5*[137]): for i, length in enumerate([135] * self.npts):
point_protocol = cnf.ControlPointFileEntryV0002() point_protocol = cnf.ControlPointFileEntryV0002()
raw_point = f.read(length) raw_point = f.read(length)
point_protocol.ParseFromString(raw_point) point_protocol.ParseFromString(raw_point)
self.assertEqual(str((i + 1) * 100), point_protocol.id) self.assertEqual(str(i), point_protocol.id)
self.assertEqual(2, point_protocol.type) self.assertEqual(2, point_protocol.type)
for m in point_protocol.measures: for m in point_protocol.measures:
self.assertTrue(m.serialnumber in self.serials) self.assertTrue(m.serialnumber in self.serials)
...@@ -94,12 +99,11 @@ class TestWriteIsisControlNetwork(unittest.TestCase): ...@@ -94,12 +99,11 @@ class TestWriteIsisControlNetwork(unittest.TestCase):
self.assertEqual(10, mpoints) self.assertEqual(10, mpoints)
points_bytes = find_in_dict(pvl_header, 'PointsBytes') points_bytes = find_in_dict(pvl_header, 'PointsBytes')
self.assertEqual(685, points_bytes) self.assertEqual(675, points_bytes)
points_start_byte = find_in_dict(pvl_header, 'PointsStartByte') points_start_byte = find_in_dict(pvl_header, 'PointsStartByte')
self.assertEqual(self.point_start_byte, points_start_byte) self.assertEqual(self.point_start_byte, points_start_byte)
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
#os.remove('test.net') os.remove('test.net')
pass
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment