Exemplo n.º 1
0
    def test_find_location(self):
        # открытие файла с валидными данными, и поиск в дереве, сформированном на их основе
        path = os.path.realpath(
            __file__)[:-len('treeTests.py')] + 'filesToRead/inputForTree.txt'
        data = read_file(path)
        control_point1 = data['point']
        intervals1 = data['intervals']
        tree1 = CenteredIntervalTree(intervals1)
        self.assertEqual(tree1.find_location(control_point1),
                         Interval(0, 5, 5))

        # открытие файла с валидными данными, и поиск в дереве, в котором все интервалы покрывают контрольную точку
        path = os.path.realpath(
            __file__)[:-len('treeTests.py')] + 'filesToRead/inputForTree2.txt'
        data = read_file(path)
        control_point1 = data['point']
        intervals1 = data['intervals']
        tree1 = CenteredIntervalTree(intervals1)
        self.assertEqual(tree1.find_location(control_point1),
                         Interval(0, 2, 7))

        # открытие файла с валидными данными, и поиск элемента, которого в дереве нет
        path = os.path.realpath(
            __file__)[:-len('treeTests.py')] + 'filesToRead/inputForTree3.txt'
        data = read_file(path)
        control_point1 = data['point']
        intervals1 = data['intervals']
        tree1 = CenteredIntervalTree(intervals1)
        self.assertEqual(tree1.find_location(control_point1), None)
Exemplo n.º 2
0
    def test_contain_point(self):
        p = 5  # контрольная точка

        # интервал строго левее точки
        self.assertEqual(Interval(-2, 3, 0).contain(5), -1)

        # интервал строго правее точки
        self.assertEqual(Interval(6, 8, 0).contain(5), 1)

        # точка лежит в интервале
        self.assertEqual(Interval(-2, 6, 0).contain(5), 0)

        # точка лежит на левой границе (т.е. лежит в интервале)
        self.assertEqual(Interval(5, 7, 0).contain(5), 0)

        # точка лежит на правой границе (т.е. лежит в интервале)
        self.assertEqual(Interval(-2, 5, 0).contain(5), 0)
Exemplo n.º 3
0
    def test_file_parcing(self):
        path = os.path.realpath(__file__)[:-len('fileReadingTest.py')]

        # чтение из правильно составленного файла
        data_from_file1 = read_file(path + 'filesToRead/correctInput.txt')
        self.assertEqual(data_from_file1['point'], 4)
        self.assertEqual(
            data_from_file1['intervals'],
            [Interval(-3, 20, 3),
             Interval(0, 5, 5),
             Interval(-8, 1, 2)])

        # чтение из файла, с частично правильно заполненными данными
        data_from_file2 = read_file(path + 'filesToRead/wrongInput1.txt')
        self.assertEqual(data_from_file2, None)
        data_from_file3 = read_file(path + 'filesToRead/wrongInput2.txt')
        self.assertEqual(data_from_file3, None)
Exemplo n.º 4
0
    def test_calculate_x_center(self):
        # непересекающиеся интервалы, весь диапазон == 6
        ints1 = [Interval(0, 2, 0), Interval(3, 4, 0), Interval(5, 6, 0)]
        self.assertEqual(Node()._calculate_x_center(ints1), 3.5)

        # частично пересекающиеся интервалы, весь диапазон == 6
        ints2 = [Interval(0, 2, 0), Interval(1, 3, 0), Interval(4, 6, 0)]
        self.assertEqual(Node()._calculate_x_center(ints2), 2.5)

        # все интервалы покрываются одним, весь диапазон == 21
        ints3 = [
            Interval(0, 21, 0),
            Interval(1, 3, 0),
            Interval(10, 15, 0),
            Interval(12, 17, 0)
        ]
        self.assertEqual(Node()._calculate_x_center(ints3), 11)
Exemplo n.º 5
0
    def test_is_empty(self):
        # когда часть полей не введена
        self.assertTrue(Interval(1, 2).empty())
        self.assertTrue(Interval(1).empty())
        self.assertTrue(Interval().empty())

        # когда вводятся неверные данные (концы интервала не могут совпадать!)
        self.assertTrue(Interval(2, 2, 3).empty())

        # когда вводятся неверные данные (левый конец не может быть больше правого)
        self.assertTrue(Interval(5, 2, 3).empty())

        # когда все поля введены верно - интервал НЕ пуст
        self.assertFalse(Interval(1, 2, 3).empty())
        self.assertFalse(Interval(1, 2, 0).empty())
Exemplo n.º 6
0
    def test_equal_operator(self):
        # одинаковые полные интервалы
        self.assertEqual(Interval(1, 2, 3), Interval(1, 2, 3))

        # пустые интервалы
        self.assertEqual(Interval(1, 2), Interval(1))

        # сравнение полного интервала и НЕ интервала
        self.assertNotEqual(Interval(1, 2, 3), 1)

        # сравнение пустого интервала и None
        self.assertNotEqual(Interval(), None)
Exemplo n.º 7
0
def read_file(filename):
    # test
    parcing_result = {'point': None, 'intervals': []}

    try:
        file = open(filename, 'r')

    except:
        print('Wrong path to input file!')
        return None

    line = file.readline()
    match_x = re.match(r'\s*(-?\d+)\s*$', line)

    if match_x:
        parcing_result['point'] = int(match_x.group(0))

    else:
        print(
            'Wrong input format of control point! Rewrite your input file and restart a programm.'
        )
        return None  # неверный формат входных данных, а именно контрольной точки

    line = file.readline()
    while line:
        m = re.match(
            r'\[\s*(?P<begin_point>(-?\d+))\s*,\s*(?P<end_point>(-?\d+))\]\s+(?P<weight>(-?\d+))',
            line)
        if m:
            parcing_result['intervals'].append(
                Interval(int(m.group('begin_point')),
                         int(m.group('end_point')), int(m.group('weight'))))

        else:
            print(
                'line "',
                line[:-1],
                '" has wrong input format! Rewrite your input file and restart a programm.',
                sep='')
            return None

        line = file.readline()

    file.close()
    return parcing_result
Exemplo n.º 8
0
    def test_get_from_sorted(self):
        node = Node()
        ints = [
            Interval(0, 21, 0),
            Interval(10, 15, 0),
            Interval(1, 3, 0),
            Interval(12, 17, 0),
        ]
        node.center_intervals = CenterIntervals(ints)

        # поиск в массиве, отсортированном по конечной координате
        self.assertEqual(
            node._get_from_sorted(10, end_sorted=True),
            [Interval(0, 21, 0), Interval(10, 15, 0)])

        # поиск в массиве, отсортированном по начальной координате
        self.assertEqual(
            node._get_from_sorted(10, end_sorted=False),
            [Interval(0, 21, 0), Interval(10, 15, 0)])

        # поиск несуществующей точки
        self.assertEqual(node._get_from_sorted(127, end_sorted=True), [])
        self.assertEqual(node._get_from_sorted(-15, end_sorted=False), [])
Exemplo n.º 9
0
    def test_set_intervals(self):
        # Вершина с двумя сыновями
        ints1 = [Interval(0, 2, 0), Interval(3, 4, 0), Interval(5, 6, 0)]
        node1 = Node(ints1)
        self.assertEqual(node1.left_int.center_intervals.begin_sorted, [
            Interval(0, 2, 0),
        ])
        self.assertEqual(node1.right_int.center_intervals.begin_sorted, [
            Interval(5, 6, 0),
        ])
        self.assertEqual(node1.center_intervals.begin_sorted, [
            Interval(3, 4, 0),
        ])

        # Вершина без сыновей
        ints2 = [
            Interval(0, 2, 0),
        ]
        node2 = Node(ints2)
        self.assertEqual(node2.left_int.center_intervals, None)
        self.assertEqual(node2.right_int.center_intervals, None)
        self.assertEqual(node2.center_intervals.begin_sorted, [
            Interval(0, 2, 0),
        ])
Exemplo n.º 10
0
def split_into_bins(data):
    """
    Splits the data into bins along each axis
    It creates floor(1 + log2(len(data))) bins for each axis
    
    Arguments:
    data - data array to split up into bins
    Returns: An array of bins for each dimension, number of bins per axis
    """

    bins = []
    for col_idx in range(len(data[0])):
        column_bins = []
        column_data = [x[col_idx] for x in data]
        col_min = min(column_data)
        col_max = max(column_data)

        interval_length = col_max - col_min
        # divide interval 1 + log2(n) bins
        nr_of_bins = math.floor(1 + math.log2(len(column_data)))

        column_bins = []
        b = interval_length / nr_of_bins
        for i in range(nr_of_bins):
            # adds a bin with a start and end interval
            bin_interval = Interval(col_min + b * i, col_min + b * (i + 1))

            column_bins.append(Bin(i, bin_interval, col_idx))

        # compute support for each bin
        for i, datapoint in enumerate(column_data):
            bin_index = int((datapoint - col_min) / b)
            bin_index = bin_index if bin_index < nr_of_bins else bin_index - 1
            column_bins[bin_index].add_point(data[i])

        bins.append(column_bins)
    return bins, nr_of_bins
Exemplo n.º 11
0
 def test_make_empty(self):
     test_interval = Interval(1, 2, 3)  # точно НЕ пустой интервал
     test_interval._make_empty()  # делаем пустым
     self.assertTrue(test_interval.empty())  # становится пустым
Exemplo n.º 12
0
    def test_find(self):
        # поиск в непересекающихся интервалах
        ints1 = [Interval(0, 2, 0), Interval(3, 4, 0), Interval(5, 6, 0)]
        node1 = Node(ints1)

        # покрываемая интервалами точка
        self.assertEqual(node1.find(3), [
            Interval(3, 4, 0),
        ])
        # не покрываемая интервалами точка
        self.assertEqual(node1.find(12), [])

        # поиск в пересекающихся интервалах
        ints2 = [
            Interval(0, 21, 0),
            Interval(1, 3, 0),
            Interval(10, 15, 0),
            Interval(12, 17, 0)
        ]
        node2 = Node(ints2)

        # точка находится в нескольких интервалах
        self.assertEqual(
            node2.find(10),
            [Interval(0, 21, 0), Interval(10, 15, 0)])
        # точка лежит ровно в одном интервале
        self.assertEqual(node2.find(18), [
            Interval(0, 21, 0),
        ])
        # точка не лежит ни в одном интервале
        self.assertEqual(node2.find(-6), [])