import copy from time import clock import unittest from nose.tools import eq_ from helix.calculators.subarray_graph import SubarrayGraph from test.fixtures.sample_arrays import * from helix.constants.system_type import SystemType class SubarrayGraphTest(unittest.TestCase): def test_find_disconnected_subgraphs(self): copy_dumbell_no_wind_anchors = copy.deepcopy(dumbell_no_wind_anchors) graph = SubarrayGraph(copy_dumbell_no_wind_anchors, SystemType.singleTilt) graph.pop_rung() subgraphs = graph.find_disconnected_subgraphs() eq_(len(subgraphs), 2) eq_(len(subgraphs[0]), 4) eq_(len(subgraphs[1]), 4) def test_find_disconnected_subgraphs_more_complicated(self): copy_odd_shape_no_wind_anchors = copy.deepcopy(odd_shape_no_wind_anchors) graph = SubarrayGraph(copy_odd_shape_no_wind_anchors, SystemType.singleTilt) graph.pop_rung() subgraphs = graph.find_disconnected_subgraphs() eq_(len(subgraphs), 3) eq_(len(subgraphs[0]), 4) eq_(len(subgraphs[1]), 8) eq_(len(subgraphs[2]), 1) def test_find_node(self): copy_odd_shape_no_wind_anchors = copy.deepcopy(odd_shape_no_wind_anchors) graph = SubarrayGraph(copy_odd_shape_no_wind_anchors, SystemType.singleTilt) eq_(graph.find_node(Coordinate(-1, -1)), None) lower_left_node = self.naive_find_node(graph, Coordinate(0, 0)) eq_(graph.find_node(Coordinate(0, 0)), lower_left_node) middle_ish_node = self.naive_find_node(graph, Coordinate(2, 7)) eq_(graph.find_node(Coordinate(2, 7)), middle_ish_node) # def test_find_node_performance(self): # copy_odd_shape_no_wind_anchors = copy.deepcopy(odd_shape_no_wind_anchors) # graph = SubarrayGraph(copy_odd_shape_no_wind_anchors, SystemType.singleTilt) # # iteration_count = 100 # # invalid_base = self.check_performance(lambda: self.naive_find_node(graph, Coordinate(-1, -1)), iteration_count) # lower_left_base = self.check_performance(lambda: self.naive_find_node(graph, Coordinate(0, 0)), iteration_count) # middle_ish_base = self.check_performance(lambda: self.naive_find_node(graph, Coordinate(2, 7)), iteration_count) # # invalid_test = self.check_performance(lambda: graph.find_node(Coordinate(-1, -1)), iteration_count) # lower_left_test = self.check_performance(lambda: graph.find_node(Coordinate(0, 0)), iteration_count) # middle_ish_test = self.check_performance(lambda: graph.find_node(Coordinate(2, 7)), iteration_count) # # print("Invalid coordinate: %f base, %f actual" % (invalid_base, invalid_test)) # print("0, 0 coordinate: %f base, %f actual" % (lower_left_base, lower_left_test)) # print("2, 7 coordinate: %f base, %f actual" % (middle_ish_base, middle_ish_test)) # # assert invalid_test < (invalid_base / 10), "Expected invalid coordinate to almost no-op, didn't" # assert lower_left_test < lower_left_base, "Expected 0, 0 coordinate to be better than naive approach" # assert middle_ish_base < middle_ish_test, "Expected 2, 7 coordinate to be better than naive approach" def naive_find_node(self, graph, coordinate): for node in graph.nodes: if node.location == coordinate: return node def check_performance(self, function, iterations): start = clock() for _ in range(iterations): function() end = clock() return (end - start) / iterations