[PATCH] D49780: [clangd] Use a sigmoid style function for #usages boost in symbol quality.

Eric Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 25 01:57:37 PDT 2018


ioeric created this revision.
ioeric added a reviewer: ilya-biryukov.
Herald added subscribers: cfe-commits, arphaman, jkorous, MaskRay.

This has a shape to similar logrithm function but grows much slower for
large #usages.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D49780

Files:
  clangd/Quality.cpp
  unittests/clangd/CodeCompleteTests.cpp


Index: unittests/clangd/CodeCompleteTests.cpp
===================================================================
--- unittests/clangd/CodeCompleteTests.cpp
+++ unittests/clangd/CodeCompleteTests.cpp
@@ -476,11 +476,12 @@
 }
 
 TEST(CompletionTest, ReferencesAffectRanking) {
-  auto Results = completions("int main() { abs^ }", {ns("absl"), func("abs")});
-  EXPECT_THAT(Results.Completions, HasSubsequence(Named("abs"), Named("absl")));
+  auto Results = completions("int main() { abs^ }", {ns("absl"), func("absb")});
+  EXPECT_THAT(Results.Completions, HasSubsequence(Named("absb"), Named("absl")));
   Results = completions("int main() { abs^ }",
-                        {withReferences(10000, ns("absl")), func("abs")});
-  EXPECT_THAT(Results.Completions, HasSubsequence(Named("absl"), Named("abs")));
+                        {withReferences(10000, ns("absl")), func("absb")});
+  EXPECT_THAT(Results.Completions,
+              HasSubsequence(Named("absl"), Named("absb")));
 }
 
 TEST(CompletionTest, GlobalQualified) {
Index: clangd/Quality.cpp
===================================================================
--- clangd/Quality.cpp
+++ clangd/Quality.cpp
@@ -190,8 +190,19 @@
 
   // This avoids a sharp gradient for tail symbols, and also neatly avoids the
   // question of whether 0 references means a bad symbol or missing data.
-  if (References >= 10)
-    Score *= std::log10(References);
+  if (References >= 10) {
+    // Use a sigmoid style boosting function. The shape is similar to logrithm
+    // except this flats out better for large numbers (e.g. 2.58 for 1M
+    // refererences).
+    // The following boosting function is a simplication of:
+    //   m = 0.06
+    //   f = 12.0
+    //   boost = f * sigmoid(m * std::log(References)) - 0.5 * f + 0.59
+    // Sample data points: (10, 1.00), (100, 1.41), (1000, 1.82),
+    //                     (10K, 2.21), (100K, 2.58), (1M, 2.94)
+    float s = 1.0 / std::pow(References, 0.06);
+    Score *= 6.0 * (1 - s) / (1 + s) + 0.59;
+  }
 
   if (Deprecated)
     Score *= 0.1f;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49780.157202.patch
Type: text/x-patch
Size: 2062 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180725/71caa0d2/attachment.bin>


More information about the cfe-commits mailing list