def test_trivial_weighted_mean_entity(self):
        points = [Point2D(2, 2), Point2D(2, 5), Point2D(6, 5), Point2D(7, 3), Point2D(4, 7)]
        entity = LinearRegressionEntity(points)

        weighted_entity = LinearRegressionEntity.weighted_mean_entity([entity])
        self.assertAlmostEquals(first=entity.slope, second=weighted_entity.slope, delta=1e-6)
        self.assertAlmostEquals(first=entity.offset, second=weighted_entity.offset, delta=1e-6)
    def test_hard_mahalanobis_distance_sqr(self):
        points1 = [Point2D(2, 2), Point2D(2, 5), Point2D(6, 5), Point2D(7, 3), Point2D(4, 7)]
        points2 = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]

        entity1 = LinearRegressionEntity(points1)
        entity2 = LinearRegressionEntity(points2)

        d = LinearRegressionEntity.mahalanobis_distance_sqr(entity1, entity2)
        self.assertAlmostEqual(first=d, second=0.543724758, delta=1e-6)
    def test_can_merge_true(self):
        points1 = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]
        entity1 = LinearRegressionEntity(points1)
        coordinator1 = LinearRegressionCoordinator(entity1, 2)

        points2 = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]
        entity2 = LinearRegressionEntity(points2)
        coordinator2 = LinearRegressionCoordinator(entity2, 5)

        self.assertTrue(coordinator2.can_merge(coordinator1))
    def test_init_weighted_mean_entity(self):
        points1 = [Point2D(2, 2), Point2D(2, 5), Point2D(6, 5), Point2D(7, 3), Point2D(4, 7)]
        points2 = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]

        entity1 = LinearRegressionEntity(points1)
        entity2 = LinearRegressionEntity(points2)

        weighted_mean_entity = LinearRegressionEntity.weighted_mean_entity([entity1, entity2])
        self.assertIsNotNone(weighted_mean_entity.slope)
        self.assertIsNotNone(weighted_mean_entity.offset)
        self.assertIsNotNone(weighted_mean_entity.covariance)
    def test_merge_same(self):
        points1 = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]
        entity1 = LinearRegressionEntity(points1)
        coordinator1 = LinearRegressionCoordinator(entity1, 2)

        points2 = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]
        entity2 = LinearRegressionEntity(points2)
        coordinator2 = LinearRegressionCoordinator(entity2, 2)

        coordinator = coordinator2.merge(coordinator1)

        self.assertEqual(first=coordinator.start_index, second=2)
        self.assertEqual(first=len(coordinator.entity.points), second=5)
    def test_init(self):
        points = [Point2D(6, 5), Point2D(7, 4), Point2D(8, 7), Point2D(5, 6), Point2D(5, 4)]
        entity = LinearRegressionEntity(points)
        coordinator = LinearRegressionCoordinator(entity, 10)

        self.assertEqual(first=entity, second=coordinator.entity)
        self.assertEqual(first=coordinator.start_index, second=10)
    def test_linear_entity_init(self):
        points = [Point2D(0, 0), Point2D(1, 1), Point2D(2, 2)]
        entity = LinearRegressionEntity(points)

        self.assertEqual(entity.points, points)
        self.assertAlmostEqual(first=entity._slope, second=math.tan(math.pi/4.0), delta=1e-6)
        self.assertAlmostEqual(first=entity._offset, second=0, delta=1e-6)
        self.assertIsNotNone(entity.covariance)
 def test_singular_mahalanobis_distance_sqr(self):
     points = [Point2D(0, 0), Point2D(1, 1), Point2D(2, 2)]
     entity = LinearRegressionEntity(points)
     d = LinearRegressionEntity.mahalanobis_distance_sqr(entity, entity)
     self.assertAlmostEqual(first=d, second=0.0, delta=1e-6)