Просмотр исходного кода

Merge branch 'rolling' of https://github.com/jomjol/AI-on-the-edge-device into rolling

jomjol 3 лет назад
Родитель
Сommit
645fbf0231

+ 14 - 57
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -127,59 +127,6 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
     return result;
 }
 
-/*
-int ClassFlowCNNGeneral::ZeigerEvalHybrid(float zahl, float zahl_vorgaenger, int eval_vorgaenger)
-{
-    if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybrid( " + std::to_string(zahl) + ", " + std::to_string(zahl_vorgaenger) + ", " + std::to_string(eval_vorgaenger) + ")");
-                
-    int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10;
-    int ergebnis_vorkomma = ((int) floor(zahl) + 10) % 10;
-
-
-    if (eval_vorgaenger < 0)                // keine Vorzahl vorhanden !!! --> Runde die Zahl
-    {
-        if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8))     // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
-            return ((int) round(zahl) + 10) % 10;
-        else
-            return ((int) trunc(zahl) + 10) % 10;
-    }
-
-    // 9.0, da bei getReadout() prev als int übergeben wird (9 statt 9.5)
-    // tritt bei der ersten ziffer von digit auf, wenn analog davor (2. Aufruf von getReadout)
-    if ((zahl_vorgaenger >= 0.5 ) && (zahl_vorgaenger < 9.5))
-    {
-        // kein Ziffernwechsel, da Vorkomma weit genug weg ist (0+/-0.5) --> zahl wird gerundet
-        if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8))     // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
-            return ((int) round(zahl) + 10) % 10;
-        else
-            return ((int) trunc(zahl) + 10) % 10;
-    }  
-    else
-    {
-        if (eval_vorgaenger <= 1)  // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
-        {
-            if (ergebnis_nachkomma > 5)
-                return (ergebnis_vorkomma + 1) % 10;
-            else
-                return ergebnis_vorkomma;
-        }
-        else // bleibt nur >= 9.5 --> noch kein Nulldurchgang --> 2.8 --> 2, und 3.1 --> 2
-        {
-            // hier auf 4 reduziert, da erst ab Vorgänder 9 anfängt umzustellen. Bei 9.5 Vorgänger kann die aktuelle
-            // Zahl noch x.4 - x.5 sein.
-            if (ergebnis_nachkomma >= 4)
-                return ergebnis_vorkomma;
-            else
-                return (ergebnis_vorkomma - 1 + 10) % 10;
-        }
-    }
-    if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybrid(return -1)  zahl=" + std::to_string(zahl) 
-                        + ", zahl_vorgaenger=" + std::to_string(zahl_vorgaenger) + ", eval_vorgaenger=" + std::to_string(eval_vorgaenger));
-    return -1;
-
-}
-*/
-
 int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger)
 {
     int result;
@@ -220,23 +167,33 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
         return result;
     }  
 
-    if (eval_vorgaenger <= 1)  // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
+    if (eval_vorgaenger <= 1)  // Nulldurchgang beim Vorgänger hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
     {
+        // Wir nehmen einfach an, dass das aktuelle Digit nach dem Nulldurchgang des Vorgängers
+        // mindestens zur Hälfte (x.5) durchlaufen hat
         if (ergebnis_nachkomma > 5)
+            // Das akt. digit hat noch keinen Nulldurchgang, aber der Vorgänger schon.
             result =  (ergebnis_vorkomma + 1) % 10;
         else
+            // Akt. digit und Vorgänger haben Nulldurchgang
             result =  ergebnis_vorkomma;
         if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, Nulldurchgang hat stattgefunden = " + std::to_string(result) +
                                                     " zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " +  std::to_string(DigitalUnschaerfe));
         return result;
     }
 
-    // bleibt nur >= 9.5 --> noch kein Nulldurchgang --> 2.8 --> 2, und 3.1 --> 2
-    // alles >=x.4 kann als aktuelle Zahl gelten im Übergang. Bei 9.5 Vorgänger kann die aktuelle
+    
+    // bleibt nur >= 9.x --> noch kein Nulldurchgang --> 2.8 --> 2, 
+    // und ab 9.7(DigitalUebergangsbereichVorlauf) 3.1 --> 2
+    // alles >=x.4 kann als aktuelle Zahl gelten im Übergang. Bei 9.x Vorgänger kann die aktuelle
     // Zahl noch x.6 - x.7 sein. 
-    if (ergebnis_nachkomma >= 4)
+    // Vorlauf (else - Zweig) passiert nicht bereits ab 9.
+    if (DigitalUebergangsbereichVorlauf>=zahl_vorgaenger || ergebnis_nachkomma >= 4)
+        // aktuelles digit hat genauso wie das Vorgängerdigit noch keinen Nulldurchgang. 
         result =  ergebnis_vorkomma;
     else
+        // aktuelles digit läuft dem kleineren digit (9.x) vor. Also schon >=x.0 während das vorherige Digit noch
+        // keinen Nulldurchgang hat. Daher wird um 1 reduziert.
         result =  (ergebnis_vorkomma - 1 + 10) % 10;
 
     if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, >= 9.5 --> noch kein Nulldurchgang = " + std::to_string(result) +

+ 1 - 0
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.h

@@ -30,6 +30,7 @@ protected:
     float DigitalAnalogerVorgaengerUebergangsbereich = 2;
     float DigitalUebergangsbereichVorgaengerAnalogToDigit = 1; // war vorher 2
     float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7
+    float DigitalUebergangsbereichVorlauf = 9.7; // Vorlauf-Nulldurchgang passiert erst ab ca. 9.7
 
     string cnnmodelfile;
     int modelxsize, modelysize, modelchannel;

+ 1 - 2
code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp

@@ -922,7 +922,6 @@ float ClassFlowPostProcessing::checkDigitConsistency(double input, int _decilams
         printf("checkDigitConsistency: pot=%d, decimalshift=%d\n", pot, _decilamshift);
     #endif
     pot_max = ((int) log10(input)) + 1;
-    float not_checked_input = floorf(input * pow(10, pot)) / pow(10, pot);
     #ifdef SERIAL_DEBUG
         printf("checkDigitConsistency: not_checked_input=%f\n", not_checked_input);
     #endif
@@ -960,7 +959,7 @@ float ClassFlowPostProcessing::checkDigitConsistency(double input, int _decilams
         pot++;
     }
 
-    return not_checked_input + input;
+    return input;
 }
 
 string ClassFlowPostProcessing::getReadoutRate(int _number)

+ 18 - 17
code/test/components/jomjol-flowcontroll/test_flowpostprocessing.cpp

@@ -269,12 +269,6 @@ void test_doFlow() {
         result = process_doFlow(analogs, digits, Digital100, false, false, -3);
         TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
 
-
-        // checkConsistency=true
-        // checkConsistency NOT working correctly
-        //result = process_doFlow(analogs, digits, Digital100, true, false, -3);
-        //TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
-
         // extendResolution=true
         result = process_doFlow(analogs, digits, Digital100, false, true, -3);
         TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
@@ -285,24 +279,31 @@ void test_doFlow() {
         analogs = { 9.0, 2.5, 2.9, 7.2};
         expected = "269.9227";
         expected_extended= "269.92272";
-        // Float Value reduziert die Genauigkeit hier. Korrekt wäre
-        // expected_extended= "269.92272";
-
-        // checkConsistency=true
+        
+        // extendResolution=true
         result = process_doFlow(analogs, digits, Digital100, false, false);
         TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
 
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true);
+        TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
 
-        // checkConsistency=true
-        // checkConsistency NOT working correctly
-        //result = process_doFlow(analogs, digits, Digital100, true, false, -3);
-        //TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
-
+       // Fehler bei V11.3.1 
+        // https://github.com/jomjol/AI-on-the-edge-device/issues/1028#issuecomment-1250239481
+        digits = { 1.1, 6.0, 9.1, 3.0, 5.3, 9.4};  // 169.3493 als falsches Ergebnis
+        analogs = { 3.5};
+        expected = "169.3593";
+        expected_extended= "169.35935";
+        
+        // extendResolution=false
+        result = process_doFlow(analogs, digits, Digital100, false, false, -3);
+        TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
 
-        // checkConsistency=true und extendResolution=true
-        result = process_doFlow(analogs, digits, Digital100, false, true);
+        // checkConsistency=false und extendResolution=true
+        result = process_doFlow(analogs, digits, Digital100, false, true, -3);
         TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
 
+
 }