aifastdb 3.10.5 → 3.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/aifastdb.node +0 -0
  2. package/aifastdb.win32-x64-msvc.node +0 -0
  3. package/dist/concurrent-document-store.d.ts +4 -0
  4. package/dist/concurrent-document-store.d.ts.map +1 -1
  5. package/dist/concurrent-document-store.js +6 -0
  6. package/dist/concurrent-document-store.js.map +1 -1
  7. package/dist/find-async-baseline.d.ts +33 -0
  8. package/dist/find-async-baseline.d.ts.map +1 -0
  9. package/dist/find-async-baseline.js +424 -0
  10. package/dist/find-async-baseline.js.map +1 -0
  11. package/dist/find-async-bench.d.ts +22 -0
  12. package/dist/find-async-bench.d.ts.map +1 -0
  13. package/dist/find-async-bench.js +322 -0
  14. package/dist/find-async-bench.js.map +1 -0
  15. package/dist/find-async-verify.d.ts +23 -0
  16. package/dist/find-async-verify.d.ts.map +1 -0
  17. package/dist/find-async-verify.js +286 -0
  18. package/dist/find-async-verify.js.map +1 -0
  19. package/dist/hnsw-insert-profile-verify.d.ts +35 -0
  20. package/dist/hnsw-insert-profile-verify.d.ts.map +1 -0
  21. package/dist/hnsw-insert-profile-verify.js +250 -0
  22. package/dist/hnsw-insert-profile-verify.js.map +1 -0
  23. package/dist/micro-batcher-benchmark.d.ts +3 -0
  24. package/dist/micro-batcher-benchmark.d.ts.map +1 -0
  25. package/dist/micro-batcher-benchmark.js +296 -0
  26. package/dist/micro-batcher-benchmark.js.map +1 -0
  27. package/dist/micro-batcher.d.ts +97 -0
  28. package/dist/micro-batcher.d.ts.map +1 -0
  29. package/dist/micro-batcher.js +77 -0
  30. package/dist/micro-batcher.js.map +1 -0
  31. package/dist/native.d.ts +71 -0
  32. package/dist/native.d.ts.map +1 -1
  33. package/dist/native.js +6 -1
  34. package/dist/native.js.map +1 -1
  35. package/dist/phase-387-reproducibility-audit.d.ts +3 -0
  36. package/dist/phase-387-reproducibility-audit.d.ts.map +1 -0
  37. package/dist/phase-387-reproducibility-audit.js +236 -0
  38. package/dist/phase-387-reproducibility-audit.js.map +1 -0
  39. package/dist/phase-390-baseline-multiseed.d.ts +3 -0
  40. package/dist/phase-390-baseline-multiseed.d.ts.map +1 -0
  41. package/dist/phase-390-baseline-multiseed.js +241 -0
  42. package/dist/phase-390-baseline-multiseed.js.map +1 -0
  43. package/dist/phase-390-t2-mb-grid-sweep.d.ts +3 -0
  44. package/dist/phase-390-t2-mb-grid-sweep.d.ts.map +1 -0
  45. package/dist/phase-390-t2-mb-grid-sweep.js +291 -0
  46. package/dist/phase-390-t2-mb-grid-sweep.js.map +1 -0
  47. package/dist/read-profiler-verify.js +236 -1
  48. package/dist/read-profiler-verify.js.map +1 -1
  49. package/dist/remember-many-spawn-benchmark.d.ts +3 -0
  50. package/dist/remember-many-spawn-benchmark.d.ts.map +1 -0
  51. package/dist/remember-many-spawn-benchmark.js +163 -0
  52. package/dist/remember-many-spawn-benchmark.js.map +1 -0
  53. package/dist/remember-spawn-benchmark.d.ts +3 -0
  54. package/dist/remember-spawn-benchmark.d.ts.map +1 -0
  55. package/dist/remember-spawn-benchmark.js +230 -0
  56. package/dist/remember-spawn-benchmark.js.map +1 -0
  57. package/dist/remember-spawn-receipt-benchmark.d.ts +3 -0
  58. package/dist/remember-spawn-receipt-benchmark.d.ts.map +1 -0
  59. package/dist/remember-spawn-receipt-benchmark.js +266 -0
  60. package/dist/remember-spawn-receipt-benchmark.js.map +1 -0
  61. package/dist/sgv2-async-verify.d.ts +17 -0
  62. package/dist/sgv2-async-verify.d.ts.map +1 -0
  63. package/dist/sgv2-async-verify.js +217 -0
  64. package/dist/sgv2-async-verify.js.map +1 -0
  65. package/dist/social-graph-v2-read-benchmark.d.ts +11 -2
  66. package/dist/social-graph-v2-read-benchmark.d.ts.map +1 -1
  67. package/dist/social-graph-v2-read-benchmark.js +145 -3
  68. package/dist/social-graph-v2-read-benchmark.js.map +1 -1
  69. package/dist/social-graph-v2.d.ts +65 -4
  70. package/dist/social-graph-v2.d.ts.map +1 -1
  71. package/dist/social-graph-v2.js +72 -6
  72. package/dist/social-graph-v2.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-async-verify.js","sourceRoot":"","sources":["../ts/find-async-verify.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,2EAIqC;AAOrC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAExF,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO;QACL,EAAE,EAAE,OAAO,KAAK,EAAE;QAClB,OAAO,EAAE,6BAA6B,KAAK,EAAE;QAC7C,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtF,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QAC5C,UAAU,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG;QAC/B,QAAQ,EAAE;YACR,MAAM,EAAE,SAAS,KAAK,GAAG,EAAE,EAAE;YAC7B,MAAM,EAAE,KAAK,GAAG,EAAE;YAClB,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,MAAM,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC;SACxB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAA6B;IAC9C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAA8B,EAC9B,QAAgB,EAChB,SAAS,GAAG,KAAK;IAEjB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC/C,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,gBAAgB,IAAI,QAAQ;YAAE,OAAO;QACzD,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAA8B,EAC9B,OAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAgC,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AASD,SAAS,cAAc,CACrB,KAA6B,EAC7B,SAA+C;IAE/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,KAA8B,EAC9B,GAAW,EACX,KAAa,EACb,eAAuB;IAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO;YACL,QAAQ,EAAE,iBAAiB,GAAG,WAAW,KAAK,GAAG;YACjD,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,MAAM,EAAE;SACjE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACX,OAAO;YACL,QAAQ,EAAE,iBAAiB,GAAG,WAAW,KAAK,GAAG;YACjD,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,iCAAiC,EAAE,CAAC,cAAc,EAAE;SAC7D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACX,OAAO;YACL,QAAQ,EAAE,iBAAiB,GAAG,WAAW,KAAK,GAAG;YACjD,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,kCAAkC,EAAE,CAAC,cAAc,EAAE;SAC9D,CAAC;IACJ,CAAC;IACD,wEAAwE;IACxE,yCAAyC;IACzC,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE,iBAAiB,GAAG,WAAW,KAAK,GAAG;gBACjD,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,oCAAoC,KAAK,OAAO,eAAe,GAAG;aAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,iBAAiB,GAAG,WAAW,KAAK,GAAG;QACjD,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,IAAI,EAAE,IAAI;KACX,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,CAAuB,EACvB,OAAgC;IAEhC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,QAA+C,CAAC;QAC5D,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,CAA4B,CAAC;YACzC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAuB,CAAC;YACxC,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC3C,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAK,GAAG,CAAC,MAAM,CAAY,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtE,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAI,GAAG,CAAC,KAAK,CAAY,CAAC;gBAAE,OAAO,KAAK,CAAC;YACnE,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAK,GAAG,CAAC,MAAM,CAAY,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtE,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAI,GAAG,CAAC,KAAK,CAAY,CAAC;gBAAE,OAAO,KAAK,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAA8B,EAC9B,OAAgC,EAChC,KAAa,EACb,SAAiB;IAEjB,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC;IACzE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9H,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAuB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;IACxH,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;IACzH,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,KAAK,OAAO,SAAS,GAAG,EAAE,CAAC;QAClI,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,mDAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE;QACjE,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,iBAAiB;QACvB,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,UAAU,CAAC,CAAC;QAC3C,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjD,iDAAiD;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QAE/E,OAAO,CAAC,GAAG,CACT,qBAAqB,UAAU,SAAS,SAAS,UAAU,UAAU,GAAG;YACtE,UAAU,UAAU,kBAAkB,gBAAgB,YAAY,eAAe,EAAE,CACtF,CAAC;QAEF,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB;QAC/F,MAAM,CAAC,IAAI,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CACT,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,UAAU,CAAC,CAC/E,CAAC,CAAC,kBAAkB;QACrB,MAAM,CAAC,IAAI,CACT,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,gBAAgB,CAAC,CACtF,CAAC;QACF,MAAM,CAAC,IAAI,CACT,MAAM,mBAAmB,CACvB,KAAK,EACL,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAC7B,gBAAgB,GAAG,EAAE,EACrB,gBAAgB,CACjB,CACF,CAAC,CAAC,kBAAkB;QACrB,MAAM,CAAC,IAAI,CACT,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,CACjF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1C,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CACT,yFAAyF,CAC1F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChD,UAAU,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * phase-382/T382.1 — HNSW insert-path profiler verification
3
+ *
4
+ * Drives the freshly-instrumented HNSW insert path through two scenarios:
5
+ *
6
+ * A) sync write-through (default mode, deferred OFF):
7
+ * every remember() blocks on insert_node + entry_point.write()
8
+ * → ~2,167 ops/s baseline (T382.0)
9
+ * → expect insert_node_total ≈ insert_total
10
+ *
11
+ * B) deferred mode (background indexer drains a queue):
12
+ * remember() returns after enqueue, the bg thread eventually inserts
13
+ * → ~37,925 ops/s enqueue throughput, but background insert is still
14
+ * gated on the same insert_node + entry_point lock = ~710 ops/s
15
+ * → after flushDeferredIndex(), the profiler counts reflect the
16
+ * backlog drained by the bg thread, NOT the caller's enqueue rate
17
+ *
18
+ * The 5-segment breakdown produced for each scenario tells us where the
19
+ * 1.41 ms / vector wall time is actually spent. T382.0's hypothesis is
20
+ * that the bulk lives under `insert_node_total` (= entire body of
21
+ * `entry_point.write()` guard) and that `lock_wait` is non-zero only when
22
+ * concurrent insert callers are racing for the entry-point lock.
23
+ *
24
+ * Slot semantics (see vector/hnsw/insert_profiler.rs):
25
+ * insert_total wall time of pub fn insert
26
+ * insert_node_total wall time of insert_node (== entry_point lock holding)
27
+ * lock_wait time spent waiting for entry_point.write()
28
+ * graph_traversal sum of greedy_search_level + search_level + select
29
+ * neighbor_write sum of set_neighbors_fine + add_neighbor_and_prune
30
+ * alloc_setup nodes/neighbor_locks/id_map setup inside pub fn insert
31
+ *
32
+ * Run: npx tsx packages/node/ts/hnsw-insert-profile-verify.ts
33
+ */
34
+ export {};
35
+ //# sourceMappingURL=hnsw-insert-profile-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnsw-insert-profile-verify.d.ts","sourceRoot":"","sources":["../ts/hnsw-insert-profile-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ /**
3
+ * phase-382/T382.1 — HNSW insert-path profiler verification
4
+ *
5
+ * Drives the freshly-instrumented HNSW insert path through two scenarios:
6
+ *
7
+ * A) sync write-through (default mode, deferred OFF):
8
+ * every remember() blocks on insert_node + entry_point.write()
9
+ * → ~2,167 ops/s baseline (T382.0)
10
+ * → expect insert_node_total ≈ insert_total
11
+ *
12
+ * B) deferred mode (background indexer drains a queue):
13
+ * remember() returns after enqueue, the bg thread eventually inserts
14
+ * → ~37,925 ops/s enqueue throughput, but background insert is still
15
+ * gated on the same insert_node + entry_point lock = ~710 ops/s
16
+ * → after flushDeferredIndex(), the profiler counts reflect the
17
+ * backlog drained by the bg thread, NOT the caller's enqueue rate
18
+ *
19
+ * The 5-segment breakdown produced for each scenario tells us where the
20
+ * 1.41 ms / vector wall time is actually spent. T382.0's hypothesis is
21
+ * that the bulk lives under `insert_node_total` (= entire body of
22
+ * `entry_point.write()` guard) and that `lock_wait` is non-zero only when
23
+ * concurrent insert callers are racing for the entry-point lock.
24
+ *
25
+ * Slot semantics (see vector/hnsw/insert_profiler.rs):
26
+ * insert_total wall time of pub fn insert
27
+ * insert_node_total wall time of insert_node (== entry_point lock holding)
28
+ * lock_wait time spent waiting for entry_point.write()
29
+ * graph_traversal sum of greedy_search_level + search_level + select
30
+ * neighbor_write sum of set_neighbors_fine + add_neighbor_and_prune
31
+ * alloc_setup nodes/neighbor_locks/id_map setup inside pub fn insert
32
+ *
33
+ * Run: npx tsx packages/node/ts/hnsw-insert-profile-verify.ts
34
+ */
35
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
36
+ if (k2 === undefined) k2 = k;
37
+ var desc = Object.getOwnPropertyDescriptor(m, k);
38
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
39
+ desc = { enumerable: true, get: function() { return m[k]; } };
40
+ }
41
+ Object.defineProperty(o, k2, desc);
42
+ }) : (function(o, m, k, k2) {
43
+ if (k2 === undefined) k2 = k;
44
+ o[k2] = m[k];
45
+ }));
46
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
47
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
48
+ }) : function(o, v) {
49
+ o["default"] = v;
50
+ });
51
+ var __importStar = (this && this.__importStar) || (function () {
52
+ var ownKeys = function(o) {
53
+ ownKeys = Object.getOwnPropertyNames || function (o) {
54
+ var ar = [];
55
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
56
+ return ar;
57
+ };
58
+ return ownKeys(o);
59
+ };
60
+ return function (mod) {
61
+ if (mod && mod.__esModule) return mod;
62
+ var result = {};
63
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
64
+ __setModuleDefault(result, mod);
65
+ return result;
66
+ };
67
+ })();
68
+ Object.defineProperty(exports, "__esModule", { value: true });
69
+ const os = __importStar(require("os"));
70
+ const path = __importStar(require("path"));
71
+ const fs = __importStar(require("fs"));
72
+ // Direct require: phase-382/T382.1 NAPI exports (dumpHnswInsertProfile,
73
+ // dumpHnswInsertProfileReset) are top-level functions on the .node module
74
+ // and are not yet wired through native.ts (intentional — they are
75
+ // process-wide diagnostics, not part of the public TS surface).
76
+ function loadNative() {
77
+ const candidates = [
78
+ path.join(__dirname, '..', 'aifastdb.win32-x64-msvc.node'),
79
+ path.join(__dirname, '..', 'aifastdb.node'),
80
+ path.join(process.cwd(), 'packages', 'node', 'aifastdb.win32-x64-msvc.node'),
81
+ path.join(process.cwd(), 'packages', 'node', 'aifastdb.node'),
82
+ ];
83
+ for (const p of candidates) {
84
+ try {
85
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
86
+ return require(p);
87
+ }
88
+ catch {
89
+ /* try next */
90
+ }
91
+ }
92
+ throw new Error('Failed to load aifastdb native module');
93
+ }
94
+ function parseSnapshot(text) {
95
+ const rows = [];
96
+ const re = /^\s+(\S+)\s+count=\s*(\d+)\s+total_ns=\s*(\d+)\s+avg_ns=\s*(\d+)\s*$/;
97
+ for (const line of text.split('\n')) {
98
+ const m = line.match(re);
99
+ if (m) {
100
+ const total = Number(m[3]);
101
+ const count = Number(m[2]);
102
+ rows.push({
103
+ name: m[1],
104
+ count,
105
+ totalNs: total,
106
+ avgNs: count > 0 ? total / count : 0,
107
+ });
108
+ }
109
+ }
110
+ return rows;
111
+ }
112
+ function fmtNs(ns) {
113
+ if (ns >= 1000000)
114
+ return `${(ns / 1000000).toFixed(2)}ms`;
115
+ if (ns >= 1000)
116
+ return `${(ns / 1000).toFixed(1)}us`;
117
+ return `${ns}ns`;
118
+ }
119
+ function reportScenario(label, rows) {
120
+ // Locate the parent slot for percentage calculation. We use
121
+ // insert_total as the wall-time anchor; if it's zero (e.g. only the
122
+ // background indexer ran and pub fn insert wasn't called from the
123
+ // caller side), fall back to insert_node_total.
124
+ const total = rows.find((r) => r.name === 'insert_total');
125
+ const nodeTotal = rows.find((r) => r.name === 'insert_node_total');
126
+ const anchor = total && total.totalNs > 0 ? total : nodeTotal;
127
+ if (!anchor || anchor.totalNs === 0) {
128
+ console.log(`\n=== ${label} ===\n (no inserts recorded)`);
129
+ return;
130
+ }
131
+ console.log(`\n=== ${label} ===`);
132
+ console.log(` anchor=${anchor.name} count=${anchor.count} avg=${fmtNs(anchor.avgNs)}`);
133
+ for (const r of rows) {
134
+ if (r.count === 0)
135
+ continue;
136
+ const pct = ((r.totalNs / anchor.totalNs) * 100).toFixed(1);
137
+ console.log(` ${r.name.padEnd(20)} count=${String(r.count).padStart(8)} avg=${fmtNs(r.avgNs).padStart(10)} share=${pct}%`);
138
+ }
139
+ }
140
+ function makeVec(dim) {
141
+ const v = new Array(dim);
142
+ for (let i = 0; i < dim; i++)
143
+ v[i] = Math.random() - 0.5;
144
+ return v;
145
+ }
146
+ async function main() {
147
+ const native = loadNative();
148
+ const dump = native.dumpHnswInsertProfile;
149
+ const dumpReset = native.dumpHnswInsertProfileReset;
150
+ const Aifastdb = native.AiFastDb || native.Aifastdb;
151
+ if (!dump || !dumpReset) {
152
+ throw new Error('dumpHnswInsertProfile not exposed on native module. Available: ' +
153
+ Object.keys(native).slice(0, 30).join(', '));
154
+ }
155
+ if (!Aifastdb)
156
+ throw new Error('AiFastDb class not found on native module');
157
+ const dim = 128;
158
+ const N_SYNC = 2000;
159
+ const N_DEFERRED = 5000;
160
+ console.log(`phase-382/T382.1 HNSW insert-path profiler verify (dim=${dim}, N_sync=${N_SYNC}, N_deferred=${N_DEFERRED})`);
161
+ // ---- Scenario A: sync write-through (deferred OFF) ----
162
+ const tmpA = fs.mkdtempSync(path.join(os.tmpdir(), 'hnsw-prof-sync-'));
163
+ const dbA = new Aifastdb({ path: path.join(tmpA, 'db'), dimension: dim });
164
+ dumpReset();
165
+ const tA0 = performance.now();
166
+ for (let i = 0; i < N_SYNC; i++) {
167
+ dbA.remember({
168
+ content: `sync-${i}`,
169
+ tags: ['prof'],
170
+ embedding: makeVec(dim),
171
+ });
172
+ }
173
+ const tA1 = performance.now();
174
+ const opsA = (N_SYNC * 1000) / (tA1 - tA0);
175
+ const snapA = parseSnapshot(dump());
176
+ reportScenario(`Scenario A (sync write-through, deferred OFF) ops/s=${opsA.toFixed(0)}`, snapA);
177
+ try {
178
+ dbA.close?.();
179
+ }
180
+ catch {
181
+ /* ignore */
182
+ }
183
+ // ---- Scenario B: deferred mode (background indexer drains the queue) ----
184
+ const tmpB = fs.mkdtempSync(path.join(os.tmpdir(), 'hnsw-prof-deferred-'));
185
+ const dbB = new Aifastdb({ path: path.join(tmpB, 'db'), dimension: dim });
186
+ dbB.enableDeferredIndexing(1000, 50, 200000);
187
+ dumpReset();
188
+ const tB0 = performance.now();
189
+ for (let i = 0; i < N_DEFERRED; i++) {
190
+ dbB.remember({
191
+ content: `deferred-${i}`,
192
+ tags: ['prof'],
193
+ embedding: makeVec(dim),
194
+ });
195
+ }
196
+ const tB1 = performance.now();
197
+ const enqueueOps = (N_DEFERRED * 1000) / (tB1 - tB0);
198
+ console.log(`\n[B] enqueue throughput (caller side, before flush) = ${enqueueOps.toFixed(0)} ops/s`);
199
+ // Now drain the queue and snapshot the bg-thread profile.
200
+ const flushT0 = performance.now();
201
+ dbB.flushDeferredIndex();
202
+ const flushSec = (performance.now() - flushT0) / 1000;
203
+ const drainOps = N_DEFERRED / flushSec;
204
+ console.log(`[B] background drain finished in ${flushSec.toFixed(1)}s (${drainOps.toFixed(0)} true HNSW inserts/s)`);
205
+ const snapB = parseSnapshot(dump());
206
+ reportScenario(`Scenario B (deferred mode, bg indexer drained) drain_ops/s=${drainOps.toFixed(0)}`, snapB);
207
+ try {
208
+ dbB.close?.();
209
+ }
210
+ catch {
211
+ /* ignore */
212
+ }
213
+ // ---- Decision summary ----
214
+ const findA = (n) => snapA.find((r) => r.name === n);
215
+ const findB = (n) => snapB.find((r) => r.name === n);
216
+ const totalA = findA('insert_total');
217
+ const nodeA = findA('insert_node_total');
218
+ const traversalA = findA('graph_traversal');
219
+ const neighborA = findA('neighbor_write');
220
+ const lockA = findA('lock_wait');
221
+ const allocA = findA('alloc_setup');
222
+ console.log('\n--- T382.1 decision summary (Scenario A, single-thread) ---');
223
+ if (totalA && nodeA && totalA.totalNs > 0) {
224
+ const nodeShare = (nodeA.totalNs / totalA.totalNs) * 100;
225
+ const traversalShare = traversalA
226
+ ? (traversalA.totalNs / totalA.totalNs) * 100
227
+ : 0;
228
+ const neighborShare = neighborA
229
+ ? (neighborA.totalNs / totalA.totalNs) * 100
230
+ : 0;
231
+ const lockShare = lockA ? (lockA.totalNs / totalA.totalNs) * 100 : 0;
232
+ const allocShare = allocA ? (allocA.totalNs / totalA.totalNs) * 100 : 0;
233
+ console.log(` insert_node_total share = ${nodeShare.toFixed(1)}% (entry_point.write() guard cost)`);
234
+ console.log(` graph_traversal share = ${traversalShare.toFixed(1)}%`);
235
+ console.log(` neighbor_write share = ${neighborShare.toFixed(1)}%`);
236
+ console.log(` lock_wait share = ${lockShare.toFixed(1)}% (single-thread, expect ~0)`);
237
+ console.log(` alloc_setup share = ${allocShare.toFixed(1)}%`);
238
+ const dominant = traversalShare > neighborShare && traversalShare > allocShare
239
+ ? 'graph_traversal -> Phase 1 hypothesis A/D (defer/batch can amortize)'
240
+ : neighborShare > traversalShare
241
+ ? 'neighbor_write -> Phase 2 partitioned HNSW (per-shard locks)'
242
+ : 'alloc_setup -> Phase 2 pre-allocated node pools';
243
+ console.log(` -> dominant phase = ${dominant}`);
244
+ }
245
+ }
246
+ main().catch((e) => {
247
+ console.error(e);
248
+ process.exit(1);
249
+ });
250
+ //# sourceMappingURL=hnsw-insert-profile-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnsw-insert-profile-verify.js","sourceRoot":"","sources":["../ts/hnsw-insert-profile-verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=micro-batcher-benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"micro-batcher-benchmark.d.ts","sourceRoot":"","sources":["../ts/micro-batcher-benchmark.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * phase-385/T385.2 (E385.B): MicroBatcher vs raw rememberSpawn
39
+ * vs direct rememberManySpawn benchmark.
40
+ *
41
+ * Question being answered: can caller-side micro-batching of
42
+ * single-shot `rememberSpawn` calls into one `rememberManySpawn`
43
+ * cross-runtime spawn break the 67K NAPI dispatcher ceiling that
44
+ * capped phase-384's single-call path even with `ef_construction=50`?
45
+ *
46
+ * Sweeps:
47
+ * - windowMs ∈ {0, 1, 4, 16}
48
+ * - maxBatch ∈ {16, 32, 64, 128, 256}
49
+ * - concurrency ∈ {16, 32} (number of in-flight Promise.all callers)
50
+ *
51
+ * Baselines (phase-383 / phase-384 numbers, ef=50):
52
+ * raw rememberSpawn c=16: 67,300 ops/s
53
+ * raw rememberManySpawn bs=1000: 60,045 ops/s
54
+ * sync .remember() seq: 15,805 ops/s
55
+ *
56
+ * Decision gate (T385.3): keep MicroBatcher iff
57
+ * max micro-batched throughput >= 1.3x raw rememberSpawn c=16.
58
+ *
59
+ * Usage:
60
+ * npx tsx packages/node/ts/micro-batcher-benchmark.ts
61
+ * npx tsx packages/node/ts/micro-batcher-benchmark.ts --total 5000 --ef 50
62
+ */
63
+ const os = __importStar(require("os"));
64
+ const path = __importStar(require("path"));
65
+ const fs = __importStar(require("fs"));
66
+ const micro_batcher_1 = require("./micro-batcher");
67
+ const args = new Map();
68
+ process.argv.slice(2).forEach((arg, i, arr) => {
69
+ if (arg.startsWith('--')) {
70
+ const key = arg.slice(2);
71
+ if (i + 1 < arr.length && !arr[i + 1].startsWith('--')) {
72
+ args.set(key, arr[i + 1]);
73
+ }
74
+ else {
75
+ args.set(key, 'true');
76
+ }
77
+ }
78
+ });
79
+ const DIM = parseInt(args.get('dim') ?? '128', 10);
80
+ const TOTAL = parseInt(args.get('total') ?? '5000', 10);
81
+ const CONCURRENCIES = (args.get('concurrencies') ?? '16,32')
82
+ .split(',')
83
+ .map((s) => parseInt(s, 10));
84
+ const WINDOWS_MS = (args.get('windows') ?? '0,1,4,16')
85
+ .split(',')
86
+ .map((s) => parseInt(s, 10));
87
+ const MAX_BATCHES = (args.get('max-batches') ?? '16,32,64,128,256')
88
+ .split(',')
89
+ .map((s) => parseInt(s, 10));
90
+ const EF_CONSTRUCTION = parseInt(args.get('ef') ?? '50', 10);
91
+ // phase-387/T387.6: select the underlying batch flush call. 'spawn'
92
+ // (default) uses `rememberManySpawn` -> Vec<MemoryNode> matching the
93
+ // phase-385 baseline; 'receipt' uses `rememberManySpawnReceipts`
94
+ // shipped in phase-387/T387.3 -> Vec<WriteReceiptJS>, which collapses
95
+ // the JS-bound payload from a 13-field MemoryNode (incl. metadata
96
+ // serde_json::Value tree) to a 6-field receipt and lifts the NAPI
97
+ // dispatcher ceiling, especially under high caller concurrency.
98
+ const BACKEND = (args.get('backend') ?? 'spawn');
99
+ const EF_SEARCH = parseInt(args.get('ef-search') ?? '50', 10);
100
+ const M = parseInt(args.get('m') ?? '16', 10);
101
+ const ROOT = path.resolve(__dirname, '..', '..', '..');
102
+ const tmpRoot = path.join(os.tmpdir(), `aidb-mb-bench-${process.pid}`);
103
+ fs.mkdirSync(tmpRoot, { recursive: true });
104
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
105
+ const { AiFastDb } = require(path.join(ROOT, 'packages', 'node'));
106
+ function vectorOf(seed, dim) {
107
+ const v = new Array(dim);
108
+ for (let i = 0; i < dim; i++) {
109
+ v[i] = Math.sin(seed * 2654435761 + i * 374761393);
110
+ }
111
+ return v;
112
+ }
113
+ function makeInput(id, dim) {
114
+ return {
115
+ content: `bench doc ${id}`,
116
+ embedding: vectorOf(id, dim),
117
+ tags: ['bench'],
118
+ metadata: { id_num: id },
119
+ importance: 0.5,
120
+ };
121
+ }
122
+ function makeDb(dbPath, dim) {
123
+ fs.mkdirSync(dbPath, { recursive: true });
124
+ return new AiFastDb({
125
+ path: dbPath,
126
+ dimension: dim,
127
+ hnsw: {
128
+ m: M,
129
+ efConstruction: EF_CONSTRUCTION,
130
+ efSearch: EF_SEARCH,
131
+ dimension: dim,
132
+ maxElements: 1000000,
133
+ },
134
+ });
135
+ }
136
+ async function runRawSpawn(concurrency, total, dim) {
137
+ const db = makeDb(path.join(tmpRoot, `raw-c${concurrency}-${Date.now()}`), dim);
138
+ const inputs = Array.from({ length: total }, (_, i) => makeInput(i, dim));
139
+ const start = process.hrtime.bigint();
140
+ let next = 0;
141
+ const workers = [];
142
+ for (let w = 0; w < concurrency; w++) {
143
+ workers.push((async () => {
144
+ while (true) {
145
+ const idx = next++;
146
+ if (idx >= total)
147
+ return;
148
+ await db.rememberSpawn(inputs[idx]);
149
+ }
150
+ })());
151
+ }
152
+ await Promise.all(workers);
153
+ const elapsed = Number(process.hrtime.bigint() - start) / 1e9;
154
+ return {
155
+ windowMs: -1,
156
+ maxBatch: -1,
157
+ concurrency,
158
+ total,
159
+ elapsedSec: elapsed,
160
+ opsPerSec: total / elapsed,
161
+ avgFlushSize: 1, // raw = 1 doc per spawn
162
+ flushCount: total,
163
+ };
164
+ }
165
+ async function runMicroBatched(concurrency, total, dim, windowMs, maxBatch, pattern) {
166
+ const db = makeDb(path.join(tmpRoot, `mb-c${concurrency}-w${windowMs}-b${maxBatch}-${pattern}-${Date.now()}`), dim);
167
+ const inputs = Array.from({ length: total }, (_, i) => makeInput(i, dim));
168
+ let flushCount = 0;
169
+ let flushSizeSum = 0;
170
+ const flushFn = BACKEND === 'receipt'
171
+ ? (xs) => db.rememberManySpawnReceipts(xs)
172
+ : (xs) => db.rememberManySpawn(xs);
173
+ const batcher = new micro_batcher_1.MicroBatcher(flushFn, {
174
+ windowMs,
175
+ maxBatch,
176
+ onFlush: (info) => {
177
+ flushCount++;
178
+ flushSizeSum += info.size;
179
+ },
180
+ });
181
+ const start = process.hrtime.bigint();
182
+ if (pattern === 'fire-and-forget') {
183
+ // True coalescing: every input is pushed at once into the
184
+ // batcher queue, then we await them all together. This is the
185
+ // pattern that actually gives the batcher anything to coalesce
186
+ // (queue length grows freely up to `maxBatch`). Mirrors the
187
+ // realistic case where a producer has N items ready and just
188
+ // wants per-item Promises to fire as soon as each item lands.
189
+ const promises = inputs.map((inp) => batcher.call(inp));
190
+ await Promise.all(promises);
191
+ }
192
+ else {
193
+ // sequential: every "caller" awaits its current call before
194
+ // pushing the next, with `concurrency` parallel callers. The
195
+ // queue length is then bounded by `concurrency` (NOT by
196
+ // `maxBatch`), because each caller is blocked on its own
197
+ // pending Promise. This is the pattern that BREAKS micro-
198
+ // batching on a window-driven flush — it forces every batch to
199
+ // wait `windowMs` because `maxBatch > concurrency` is never
200
+ // reached.
201
+ let next = 0;
202
+ const workers = [];
203
+ for (let w = 0; w < concurrency; w++) {
204
+ workers.push((async () => {
205
+ while (true) {
206
+ const idx = next++;
207
+ if (idx >= total)
208
+ return;
209
+ await batcher.call(inputs[idx]);
210
+ }
211
+ })());
212
+ }
213
+ await Promise.all(workers);
214
+ }
215
+ const elapsed = Number(process.hrtime.bigint() - start) / 1e9;
216
+ return {
217
+ windowMs,
218
+ maxBatch,
219
+ concurrency,
220
+ total,
221
+ elapsedSec: elapsed,
222
+ opsPerSec: total / elapsed,
223
+ avgFlushSize: flushCount > 0 ? flushSizeSum / flushCount : 0,
224
+ flushCount,
225
+ };
226
+ }
227
+ async function main() {
228
+ console.log(`[bench] phase-385/T385.2 MicroBatcher vs raw rememberSpawn (phase-387 backend=${BACKEND})`);
229
+ console.log(`[bench] dim=${DIM} total=${TOTAL} ef=${EF_CONSTRUCTION} concurrencies=${CONCURRENCIES.join(',')}`);
230
+ console.log(`[bench] windows=${WINDOWS_MS.join(',')}ms max_batches=${MAX_BATCHES.join(',')}`);
231
+ console.log(`[bench] node=${process.version} cpus=${os.cpus().length}`);
232
+ console.log('');
233
+ // 1. raw baselines
234
+ console.log('Phase A: raw rememberSpawn (no batcher)');
235
+ const rawResults = [];
236
+ for (const c of CONCURRENCIES) {
237
+ const r = await runRawSpawn(c, TOTAL, DIM);
238
+ rawResults.push(r);
239
+ console.log(` raw c=${String(c).padStart(2)} elapsed=${r.elapsedSec.toFixed(3)}s ops/s=${r.opsPerSec.toFixed(1).padStart(10)}`);
240
+ }
241
+ const rawC16 = rawResults.find((r) => r.concurrency === 16);
242
+ const rawBaseline = rawC16?.opsPerSec ?? rawResults[0].opsPerSec;
243
+ console.log('');
244
+ // 2a. micro-batched sweep (fire-and-forget pattern — true coalescing)
245
+ console.log('Phase B1: MicroBatcher fire-and-forget (queue grows to maxBatch)');
246
+ const mbResults = [];
247
+ for (const win of WINDOWS_MS) {
248
+ for (const mb of MAX_BATCHES) {
249
+ const r = await runMicroBatched(1, TOTAL, DIM, win, mb, 'fire-and-forget');
250
+ mbResults.push(r);
251
+ const lift = r.opsPerSec / rawBaseline;
252
+ console.log(` mb-faf win=${String(win).padStart(2)}ms max=${String(mb).padStart(3)} ` +
253
+ `elapsed=${r.elapsedSec.toFixed(3)}s ops/s=${r.opsPerSec.toFixed(1).padStart(10)} ` +
254
+ `avg_flush=${r.avgFlushSize.toFixed(1).padStart(6)} flushes=${String(r.flushCount).padStart(5)} ` +
255
+ `lift_vs_raw_c16=${lift.toFixed(2)}x`);
256
+ }
257
+ }
258
+ console.log('');
259
+ // 2b. micro-batched sweep (sequential pattern — anti-pattern,
260
+ // here for diagnostic purposes)
261
+ console.log('Phase B2: MicroBatcher sequential callers (anti-pattern, diagnostic only)');
262
+ for (const c of CONCURRENCIES) {
263
+ for (const win of WINDOWS_MS) {
264
+ for (const mb of [16, 64]) {
265
+ const r = await runMicroBatched(c, TOTAL, DIM, win, mb, 'sequential');
266
+ const lift = r.opsPerSec / rawBaseline;
267
+ console.log(` mb-seq c=${String(c).padStart(2)} win=${String(win).padStart(2)}ms max=${String(mb).padStart(3)} ` +
268
+ `elapsed=${r.elapsedSec.toFixed(3)}s ops/s=${r.opsPerSec.toFixed(1).padStart(10)} ` +
269
+ `avg_flush=${r.avgFlushSize.toFixed(1).padStart(6)} flushes=${String(r.flushCount).padStart(5)} ` +
270
+ `lift_vs_raw_c16=${lift.toFixed(2)}x`);
271
+ }
272
+ }
273
+ }
274
+ console.log('');
275
+ // 3. summary
276
+ const best = mbResults.reduce((a, b) => (b.opsPerSec > a.opsPerSec ? b : a));
277
+ console.log('---');
278
+ console.log(`raw_rememberSpawn_c16_ops: ${rawBaseline.toFixed(1)}`);
279
+ console.log(`best_micro_batched_ops: ${best.opsPerSec.toFixed(1)} (c=${best.concurrency} win=${best.windowMs}ms max=${best.maxBatch}; avg_flush=${best.avgFlushSize.toFixed(1)})`);
280
+ console.log(`best_lift_vs_raw_c16: ${(best.opsPerSec / rawBaseline).toFixed(2)}x`);
281
+ console.log(`ef_construction: ${EF_CONSTRUCTION}`);
282
+ console.log(`platform: ${process.platform}-${process.arch}`);
283
+ console.log(`cpus: ${os.cpus().length}`);
284
+ console.log('---');
285
+ try {
286
+ fs.rmSync(tmpRoot, { recursive: true, force: true });
287
+ }
288
+ catch {
289
+ // best-effort cleanup
290
+ }
291
+ }
292
+ main().catch((err) => {
293
+ console.error('[bench] error:', err);
294
+ process.exit(1);
295
+ });
296
+ //# sourceMappingURL=micro-batcher-benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"micro-batcher-benchmark.js","sourceRoot":"","sources":["../ts/micro-batcher-benchmark.ts"],"names":[],"mappings":"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"}