Browse Source

enrichissement des méthodes d'analyse de comptage

feature/find_holes
Figg 9 months ago
parent
commit
596bf86884
1 changed files with 81 additions and 23 deletions
  1. 81
    23
      million/analyze/count_analysis.py

+ 81
- 23
million/analyze/count_analysis.py View File

@@ -1,6 +1,9 @@
1
+from typing import List
1 2
 import million.analyze.message_evaluation as msg_val
3
+from million.model.message import Message
2 4
 
3
-def check_extra_or_missing_letter(word, reference):
5
+
6
+def check_extra_or_missing_letter(word: str, reference: str) -> bool:
4 7
     len_word = len(word)
5 8
     len_ref = len(reference)
6 9
 
@@ -17,11 +20,11 @@ def check_extra_or_missing_letter(word, reference):
17 20
     return True
18 21
 
19 22
 
20
-def check_single_letter_differ(word, reference):
23
+def check_single_letter_differ(word: str, reference: str) -> bool:
21 24
     return sum(1 for x, y in zip(reference, word) if x != y) == 1
22 25
 
23 26
 
24
-def check_letter_swap(word, reference):
27
+def check_letter_swap(word: str, reference: str) -> bool:
25 28
     if len(word) != len(reference):
26 29
         return False
27 30
 
@@ -32,28 +35,83 @@ def check_letter_swap(word, reference):
32 35
     return False
33 36
 
34 37
 
35
-def check_typo(word, reference):
38
+def check_typo(word: str, reference: str) -> bool:
36 39
     if len(reference) == len(word):
37
-        return check_single_letter_differ(word, reference) or \
38
-            check_letter_swap(word, reference)
40
+        return check_single_letter_differ(word, reference) or check_letter_swap(
41
+            word, reference
42
+        )
39 43
     else:
40 44
         return check_extra_or_missing_letter(word, reference)
41 45
 
42 46
 
43
-def find_value_around_index(messages, value, idx, amplitude) -> int:
44
-    check_value = lambda x: msg_val.get(messages[x]) == value
45
-
46
-    if check_value(idx):
47
-        return idx
48
-
49
-    for offset in range(1, amplitude):
50
-        o_idx = idx + offset * +1
51
-        if check_value(o_idx):
52
-            return o_idx
53
-
54
-        o_idx = idx + offset * -1
55
-        if check_value(o_idx):
56
-            return o_idx
57
-
58
-    return -1
59
-
47
+def _check_message_concatenation(messages: List[Message], index: int, expected: int) -> bool:
48
+    """
49
+    Cette méthode détermine si la liste messages contient le compte expected à partir de l'index donné
50
+    en concaténant les valeurs des messages suivants.
51
+    Cette méthode permet de trouver un compte qui a été étalé sur plusieurs messages
52
+    """
53
+    reference = str(expected)
54
+    testing = ""
55
+
56
+    offset = 0
57
+
58
+    while len(testing) < len(reference):
59
+        next_message = messages[index + offset]
60
+        offset += 1    
61
+        if next_message.sender_name == messages[index].sender_name:
62
+            testing += str(msg_val.get(next_message))
63
+
64
+    return testing == reference
65
+
66
+
67
+def _heavy_check(messages: List[Message], index: int, expected: int) -> bool:
68
+    """
69
+    Cette méthode détermine si la liste messages contient le compte expected à partir de l'index donné.
70
+    Elle utilise pour cela des méthodes complexes qui ne permettent de trouver un résultat
71
+    seulement si on est sortis du cas nominal
72
+    """
73
+    # TODO Si on ne trouve pas le chiffre dans la plage, appliquer différentes méthodes "HEAVYCHECK" avant de le déclarer perdu
74
+    #   - créer une méthode qui concatène des messages consécutifs jusqu'a trouver la bonne valeur si la valeur est plus basse
75
+    #   - créer une méthode pour les messages ou 2 valeurs sont collées si la valeur est plus haute
76
+    #   - sub certains caractères par des chiffres selon une table préconcue, les chiffres en toute lettre par leur équivalent
77
+    #   - virer tout sauf les chiffres
78
+    m = messages[index]
79
+    word = str(msg_val.get(m))
80
+
81
+    return _check_message_concatenation(messages, index, expected) or \
82
+        check_typo(word, str(expected)) and msg_val.get(messages[index+1]) == expected+1
83
+
84
+
85
+def _check_value_around(messages, index, expected, amplitude):
86
+    for i in range(1, amplitude + 1):
87
+        if index + i < len(messages) and expected == msg_val.get(messages[index + i]):
88
+            return index + i
89
+        if expected == msg_val.get(messages[index - i]):
90
+            return index - i
91
+
92
+    return None
93
+
94
+
95
+def search_value_at(messages, index, expected, do_heavy_check=True, amplitude=1000):
96
+    """
97
+    Cette méthode détermine si la liste messages contient le compte expected à partir de l'index donné.
98
+    Le paramètre amplitude détermine la plage où effectuer les recherches autour de l'index donné.
99
+    Le paramètre do_heavy_check précise si on doit pousser l'analyse avec des méthodes plus lourdes en cas d'échec
100
+    """
101
+    # Si le message courant contient la valeur, on renvoie
102
+    curr_value = msg_val.get(messages[index])
103
+    if expected == curr_value:
104
+        return index
105
+
106
+    # Sinon on regarde aux alentours
107
+    jump_index = _check_value_around(messages, index, expected, amplitude)
108
+    if jump_index is not None:
109
+        return jump_index
110
+
111
+    # Enfin, si on ne trouve pas la valeur à l'index donné et dans l'amplitude donnée
112
+    # On performe une vérification lourde à cet endroit
113
+    if do_heavy_check and _heavy_check(messages, index, expected):
114
+        return index
115
+
116
+    # Si tout cela n'a rien donné, on renvoie None
117
+    return None

Loading…
Cancel
Save