Fix: BoS bigram from user history dictionary is too strong.

They can be always stronger than BoS predictions from the
contextual dictionary.

Bug: 17961731
Change-Id: I70297d82436c10c790bdfad6f3dfefdb4bb2f852
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
index 1c61bd4..0eae934 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.cpp
@@ -186,7 +186,9 @@
         if (bigramsIt.getBigramPos() == ptNodePos
                 && bigramsIt.getProbability() != NOT_A_PROBABILITY) {
             const int bigramConditionalProbability = getBigramConditionalProbability(
-                    prevWordPtNodeParams.getProbability(), bigramsIt.getProbability());
+                    prevWordPtNodeParams.getProbability(),
+                    prevWordPtNodeParams.representsBeginningOfSentence(),
+                    bigramsIt.getProbability());
             return getProbability(ptNodeParams.getProbability(), bigramConditionalProbability);
         }
     }
@@ -209,15 +211,19 @@
     while (bigramsIt.hasNext()) {
         bigramsIt.next();
         const int bigramConditionalProbability = getBigramConditionalProbability(
-                prevWordPtNodeParams.getProbability(), bigramsIt.getProbability());
+                prevWordPtNodeParams.getProbability(),
+                prevWordPtNodeParams.representsBeginningOfSentence(), bigramsIt.getProbability());
         listener->onVisitEntry(bigramConditionalProbability,
                 getWordIdFromTerminalPtNodePos(bigramsIt.getBigramPos()));
     }
 }
 
 int Ver4PatriciaTriePolicy::getBigramConditionalProbability(const int prevWordUnigramProbability,
-        const int bigramProbability) const {
+        const bool isInBeginningOfSentenceContext, const int bigramProbability) const {
     if (mHeaderPolicy->hasHistoricalInfoOfWords()) {
+        if (isInBeginningOfSentenceContext) {
+            return bigramProbability;
+        }
         // Calculate conditional probability.
         return std::min(MAX_PROBABILITY - prevWordUnigramProbability + bigramProbability,
                 MAX_PROBABILITY);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
index 4aa399c..1ad5e7e 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/backward/v402/ver4_patricia_trie_policy.h
@@ -175,7 +175,7 @@
     const WordAttributes getWordAttributes(const int probability,
             const PtNodeParams &ptNodeParams) const;
     int getBigramConditionalProbability(const int prevWordUnigramProbability,
-            const int bigramProbability) const;
+            const bool isInBeginningOfSentenceContext, const int bigramProbability) const;
 };
 } // namespace v402
 } // namespace backward