From fcd86144205a35c5a2be020057a591e04c974485 Mon Sep 17 00:00:00 2001 From: frankknoll Date: Fri, 17 Nov 2023 07:45:20 +0100 Subject: [PATCH] refactoring --- .../MultiLineFitting/MultiLineFitter.py | 22 +++++++++---------- .../MultiLineFitting/MultiLineFitterTest.py | 10 ++++++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitter.py b/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitter.py index 78a9877b6fc..e009b7402f4 100644 --- a/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitter.py +++ b/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitter.py @@ -1,18 +1,26 @@ import numpy as np from skspatial.objects import Line -# implementation of "Robust Multiple Structures Estimation with J-linkage" +# implementation of "Robust Multiple Structures Estimation with J-linkage" adapted from https://github.com/fkluger/vp-linkage class MultiLineFitter: @staticmethod def fitLines(points, lines, consensusThreshold): preferenceMatrix = MultiLineFitter._createPreferenceMatrix(points, lines, consensusThreshold) - _, preferenceMatrix4Clusters = MultiLineFitter.createClusters(preferenceMatrix) + _, preferenceMatrix4Clusters = MultiLineFitter._createClusters(preferenceMatrix) lineIndexes = MultiLineFitter._getLineIndexes(preferenceMatrix4Clusters) return [lines[lineIndex] for lineIndex in lineIndexes] @staticmethod - def createClusters(preferenceMatrix): + def _createPreferenceMatrix(points, lines, consensusThreshold): + preferenceMatrix = np.zeros([len(points), len(lines)], dtype = int) + for pointIndex, point in enumerate(points): + for lineIndex, line in enumerate(lines): + preferenceMatrix[pointIndex, lineIndex] = 1 if line.distance_point(point) <= consensusThreshold else 0 + return preferenceMatrix + + @staticmethod + def _createClusters(preferenceMatrix): keepClustering = True numClusters = preferenceMatrix.shape[0] clusters = [[i] for i in range(numClusters)] @@ -40,14 +48,6 @@ class MultiLineFitter: return clusters, preferenceMatrix - @staticmethod - def _createPreferenceMatrix(points, lines, consensusThreshold): - preferenceMatrix = np.zeros([len(points), len(lines)], dtype = int) - for pointIndex, point in enumerate(points): - for lineIndex, line in enumerate(lines): - preferenceMatrix[pointIndex, lineIndex] = 1 if line.distance_point(point) <= consensusThreshold else 0 - return preferenceMatrix - @staticmethod def _intersectionOverUnion(setA, setB): intersection = np.count_nonzero(np.logical_and(setA, setB)) diff --git a/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitterTest.py b/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitterTest.py index c8704a7065b..9d8704c304b 100644 --- a/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitterTest.py +++ b/src/SymptomsCausedByVaccines/MultiLineFitting/MultiLineFitterTest.py @@ -55,7 +55,7 @@ class MultiLineFitterTest(unittest.TestCase): ]) # When - clusters, _ = MultiLineFitter.createClusters(preferenceMatrix) + clusters, _ = MultiLineFitter._createClusters(preferenceMatrix) # Then np.testing.assert_array_equal( @@ -77,7 +77,7 @@ class MultiLineFitterTest(unittest.TestCase): ]) # When - clusters, _ = MultiLineFitter.createClusters(preferenceMatrix) + clusters, _ = MultiLineFitter._createClusters(preferenceMatrix) # Then np.testing.assert_array_equal( @@ -107,9 +107,13 @@ class MultiLineFitterTest(unittest.TestCase): points = [(1, 0), (2, 0), (3, 0), (1, 1), (2, 2), (3, 3)] line1 = Line.from_points([0, 0], [1, 0]) line2 = Line.from_points([0, 0], [1, 1]) + line3 = Line.from_points([0, 0], [0, 1]) # When - fittedLines = MultiLineFitter.fitLines(points, lines = [line1, line2], consensusThreshold = 0.001) + fittedLines = MultiLineFitter.fitLines(points, lines = [line1, line2, line3], consensusThreshold = 0.001) # Then np.testing.assert_array_equal(fittedLines, [line1, line2]) + +#FK-TODO: erzeuge LinesFactory.createLines(points = [(1, 0), (2, 0), (3, 0), (1, 1), (2, 2), (3, 3)]) +# Diese Funktion soll alle Linien erzeugen, die jeweils zwei verschiedene Punkte aus points verbinden. \ No newline at end of file