@delali/narsil-react-native 0.3.1-next.155 → 0.3.1-next.156

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 (253) hide show
  1. package/NOTICE +144 -0
  2. package/NarsilReactNative.podspec +2 -2
  3. package/android/CMakeLists.txt +1 -1
  4. package/cpp/HybridNarsilCoreAnalysis.cpp +277 -0
  5. package/cpp/HybridNarsilCoreImpl.hpp +43 -0
  6. package/cpp/HybridNarsilCoreKeyword.cpp +253 -0
  7. package/cpp/HybridNarsilCoreMath.cpp +47 -0
  8. package/cpp/core/include/narsil_analysis.h +86 -0
  9. package/cpp/core/include/narsil_core.h +1 -1
  10. package/cpp/core/include/narsil_keyword.h +110 -0
  11. package/cpp/core/include/narsil_math.h +36 -0
  12. package/cpp/core/src/analysis/analyse.c +281 -0
  13. package/cpp/core/src/analysis/analyser.h +49 -0
  14. package/cpp/core/src/analysis/languages.c +79 -0
  15. package/cpp/core/src/analysis/languages.h +42 -0
  16. package/cpp/core/src/analysis/normalise.c +242 -0
  17. package/cpp/core/src/analysis/normalise.h +28 -0
  18. package/cpp/core/src/analysis/split.c +183 -0
  19. package/cpp/core/src/analysis/split.h +27 -0
  20. package/cpp/core/src/analysis/stop_words.c +82 -0
  21. package/cpp/core/src/analysis/stop_words.h +19 -0
  22. package/cpp/core/src/analysis/term_cache.c +88 -0
  23. package/cpp/core/src/analysis/term_cache.h +36 -0
  24. package/cpp/core/src/analysis/text.c +161 -0
  25. package/cpp/core/src/analysis/text.h +45 -0
  26. package/cpp/core/src/analysis/transform.c +103 -0
  27. package/cpp/core/src/analysis/unicode.c +252 -0
  28. package/cpp/core/src/analysis/unicode.h +54 -0
  29. package/cpp/core/src/internal.h +4 -0
  30. package/cpp/core/src/keyword/pass.h +117 -0
  31. package/cpp/core/src/keyword/prune.c +324 -0
  32. package/cpp/core/src/keyword/request.c +179 -0
  33. package/cpp/core/src/keyword/rows.c +83 -0
  34. package/cpp/core/src/keyword/rows.h +18 -0
  35. package/cpp/core/src/keyword/score.c +257 -0
  36. package/cpp/core/src/keyword/score.h +17 -0
  37. package/cpp/core/src/keyword/scratch.c +226 -0
  38. package/cpp/core/src/keyword/scratch.h +55 -0
  39. package/cpp/core/src/keyword/select.c +155 -0
  40. package/cpp/core/src/keyword/select.h +17 -0
  41. package/cpp/core/src/languages/bulgarian_stemmer.c +114 -0
  42. package/cpp/core/src/languages/data/albanian.c +54 -0
  43. package/cpp/core/src/languages/data/amharic.c +93 -0
  44. package/cpp/core/src/languages/data/arabic.c +146 -0
  45. package/cpp/core/src/languages/data/armenian.c +46 -0
  46. package/cpp/core/src/languages/data/azerbaijani.c +68 -0
  47. package/cpp/core/src/languages/data/bambara.c +48 -0
  48. package/cpp/core/src/languages/data/basque.c +62 -0
  49. package/cpp/core/src/languages/data/belarusian.c +56 -0
  50. package/cpp/core/src/languages/data/bengali.c +63 -0
  51. package/cpp/core/src/languages/data/bosnian.c +73 -0
  52. package/cpp/core/src/languages/data/breton.c +52 -0
  53. package/cpp/core/src/languages/data/bulgarian.c +144 -0
  54. package/cpp/core/src/languages/data/burmese.c +48 -0
  55. package/cpp/core/src/languages/data/catalan.c +84 -0
  56. package/cpp/core/src/languages/data/chinese.c +70 -0
  57. package/cpp/core/src/languages/data/croatian.c +72 -0
  58. package/cpp/core/src/languages/data/czech.c +72 -0
  59. package/cpp/core/src/languages/data/dagbani.c +88 -0
  60. package/cpp/core/src/languages/data/danish.c +56 -0
  61. package/cpp/core/src/languages/data/declarations.h +114 -0
  62. package/cpp/core/src/languages/data/dutch.c +58 -0
  63. package/cpp/core/src/languages/data/english.c +172 -0
  64. package/cpp/core/src/languages/data/esperanto.c +71 -0
  65. package/cpp/core/src/languages/data/estonian.c +417 -0
  66. package/cpp/core/src/languages/data/ewe.c +89 -0
  67. package/cpp/core/src/languages/data/faroese.c +54 -0
  68. package/cpp/core/src/languages/data/fijian.c +44 -0
  69. package/cpp/core/src/languages/data/finnish.c +100 -0
  70. package/cpp/core/src/languages/data/french.c +74 -0
  71. package/cpp/core/src/languages/data/ga.c +83 -0
  72. package/cpp/core/src/languages/data/galician.c +70 -0
  73. package/cpp/core/src/languages/data/georgian.c +57 -0
  74. package/cpp/core/src/languages/data/german.c +96 -0
  75. package/cpp/core/src/languages/data/greek.c +202 -0
  76. package/cpp/core/src/languages/data/guarani.c +110 -0
  77. package/cpp/core/src/languages/data/gujarati.c +90 -0
  78. package/cpp/core/src/languages/data/haitian-creole.c +54 -0
  79. package/cpp/core/src/languages/data/hausa.c +85 -0
  80. package/cpp/core/src/languages/data/hawaiian.c +50 -0
  81. package/cpp/core/src/languages/data/hebrew.c +85 -0
  82. package/cpp/core/src/languages/data/hindi.c +91 -0
  83. package/cpp/core/src/languages/data/hungarian.c +98 -0
  84. package/cpp/core/src/languages/data/icelandic.c +73 -0
  85. package/cpp/core/src/languages/data/igbo.c +90 -0
  86. package/cpp/core/src/languages/data/indonesian.c +296 -0
  87. package/cpp/core/src/languages/data/irish.c +60 -0
  88. package/cpp/core/src/languages/data/italian.c +107 -0
  89. package/cpp/core/src/languages/data/japanese.c +52 -0
  90. package/cpp/core/src/languages/data/kannada.c +60 -0
  91. package/cpp/core/src/languages/data/kazakh.c +57 -0
  92. package/cpp/core/src/languages/data/khmer.c +71 -0
  93. package/cpp/core/src/languages/data/kinyarwanda.c +54 -0
  94. package/cpp/core/src/languages/data/kirundi.c +53 -0
  95. package/cpp/core/src/languages/data/korean.c +74 -0
  96. package/cpp/core/src/languages/data/kurmanji.c +43 -0
  97. package/cpp/core/src/languages/data/kyrgyz.c +65 -0
  98. package/cpp/core/src/languages/data/lao.c +46 -0
  99. package/cpp/core/src/languages/data/latin.c +46 -0
  100. package/cpp/core/src/languages/data/latvian.c +75 -0
  101. package/cpp/core/src/languages/data/lingala.c +88 -0
  102. package/cpp/core/src/languages/data/lithuanian.c +65 -0
  103. package/cpp/core/src/languages/data/luxembourgish.c +80 -0
  104. package/cpp/core/src/languages/data/macedonian.c +286 -0
  105. package/cpp/core/src/languages/data/malagasy.c +51 -0
  106. package/cpp/core/src/languages/data/malay.c +184 -0
  107. package/cpp/core/src/languages/data/malayalam.c +64 -0
  108. package/cpp/core/src/languages/data/maltese.c +102 -0
  109. package/cpp/core/src/languages/data/maori.c +52 -0
  110. package/cpp/core/src/languages/data/marathi.c +62 -0
  111. package/cpp/core/src/languages/data/nepali.c +72 -0
  112. package/cpp/core/src/languages/data/norwegian.c +74 -0
  113. package/cpp/core/src/languages/data/oromo.c +51 -0
  114. package/cpp/core/src/languages/data/persian.c +150 -0
  115. package/cpp/core/src/languages/data/polish.c +111 -0
  116. package/cpp/core/src/languages/data/portuguese.c +91 -0
  117. package/cpp/core/src/languages/data/punjabi.c +80 -0
  118. package/cpp/core/src/languages/data/registry.c +116 -0
  119. package/cpp/core/src/languages/data/romanian.c +93 -0
  120. package/cpp/core/src/languages/data/russian.c +76 -0
  121. package/cpp/core/src/languages/data/samoan.c +47 -0
  122. package/cpp/core/src/languages/data/sanskrit.c +53 -0
  123. package/cpp/core/src/languages/data/scottish-gaelic.c +119 -0
  124. package/cpp/core/src/languages/data/serbian.c +84 -0
  125. package/cpp/core/src/languages/data/shona.c +55 -0
  126. package/cpp/core/src/languages/data/sinhala.c +78 -0
  127. package/cpp/core/src/languages/data/slovak.c +135 -0
  128. package/cpp/core/src/languages/data/slovenian.c +139 -0
  129. package/cpp/core/src/languages/data/sorani.c +55 -0
  130. package/cpp/core/src/languages/data/spanish.c +84 -0
  131. package/cpp/core/src/languages/data/swahili.c +59 -0
  132. package/cpp/core/src/languages/data/swedish.c +60 -0
  133. package/cpp/core/src/languages/data/tagalog.c +75 -0
  134. package/cpp/core/src/languages/data/tamil.c +69 -0
  135. package/cpp/core/src/languages/data/tatar.c +548 -0
  136. package/cpp/core/src/languages/data/telugu.c +54 -0
  137. package/cpp/core/src/languages/data/thai.c +46 -0
  138. package/cpp/core/src/languages/data/tibetan.c +55 -0
  139. package/cpp/core/src/languages/data/tigrinya.c +73 -0
  140. package/cpp/core/src/languages/data/tongan.c +47 -0
  141. package/cpp/core/src/languages/data/turkish.c +100 -0
  142. package/cpp/core/src/languages/data/twi.c +88 -0
  143. package/cpp/core/src/languages/data/ukrainian.c +99 -0
  144. package/cpp/core/src/languages/data/urdu.c +174 -0
  145. package/cpp/core/src/languages/data/vietnamese.c +88 -0
  146. package/cpp/core/src/languages/data/welsh.c +143 -0
  147. package/cpp/core/src/languages/data/wolof.c +51 -0
  148. package/cpp/core/src/languages/data/xhosa.c +56 -0
  149. package/cpp/core/src/languages/data/yoruba.c +93 -0
  150. package/cpp/core/src/languages/data/zulu.c +58 -0
  151. package/cpp/core/src/languages/marks.c +64 -0
  152. package/cpp/core/src/languages/rules.c +63 -0
  153. package/cpp/core/src/languages/rules.h +68 -0
  154. package/cpp/core/src/languages/sanskrit_stemmer.c +50 -0
  155. package/cpp/core/src/languages/scripts.c +143 -0
  156. package/cpp/core/src/languages/slovenian_stemmer.c +46 -0
  157. package/cpp/core/src/languages/snowball/api.c +52 -0
  158. package/cpp/core/src/languages/snowball/api.h +43 -0
  159. package/cpp/core/src/languages/snowball/arabic_stemmer.c +1506 -0
  160. package/cpp/core/src/languages/snowball/arabic_stemmer.h +24 -0
  161. package/cpp/core/src/languages/snowball/armenian_stemmer.c +523 -0
  162. package/cpp/core/src/languages/snowball/armenian_stemmer.h +24 -0
  163. package/cpp/core/src/languages/snowball/basque_stemmer.c +1089 -0
  164. package/cpp/core/src/languages/snowball/basque_stemmer.h +24 -0
  165. package/cpp/core/src/languages/snowball/catalan_stemmer.c +1380 -0
  166. package/cpp/core/src/languages/snowball/catalan_stemmer.h +24 -0
  167. package/cpp/core/src/languages/snowball/czech_stemmer.c +582 -0
  168. package/cpp/core/src/languages/snowball/czech_stemmer.h +24 -0
  169. package/cpp/core/src/languages/snowball/danish_stemmer.c +352 -0
  170. package/cpp/core/src/languages/snowball/danish_stemmer.h +24 -0
  171. package/cpp/core/src/languages/snowball/dutch_stemmer.c +1657 -0
  172. package/cpp/core/src/languages/snowball/dutch_stemmer.h +24 -0
  173. package/cpp/core/src/languages/snowball/english_stemmer.c +1019 -0
  174. package/cpp/core/src/languages/snowball/english_stemmer.h +24 -0
  175. package/cpp/core/src/languages/snowball/esperanto_stemmer.c +716 -0
  176. package/cpp/core/src/languages/snowball/esperanto_stemmer.h +24 -0
  177. package/cpp/core/src/languages/snowball/estonian_stemmer.c +1361 -0
  178. package/cpp/core/src/languages/snowball/estonian_stemmer.h +24 -0
  179. package/cpp/core/src/languages/snowball/finnish_stemmer.c +800 -0
  180. package/cpp/core/src/languages/snowball/finnish_stemmer.h +24 -0
  181. package/cpp/core/src/languages/snowball/french_stemmer.c +1217 -0
  182. package/cpp/core/src/languages/snowball/french_stemmer.h +24 -0
  183. package/cpp/core/src/languages/snowball/german_stemmer.c +567 -0
  184. package/cpp/core/src/languages/snowball/german_stemmer.h +24 -0
  185. package/cpp/core/src/languages/snowball/greek_stemmer.c +3450 -0
  186. package/cpp/core/src/languages/snowball/greek_stemmer.h +24 -0
  187. package/cpp/core/src/languages/snowball/hindi_stemmer.c +325 -0
  188. package/cpp/core/src/languages/snowball/hindi_stemmer.h +24 -0
  189. package/cpp/core/src/languages/snowball/hungarian_stemmer.c +742 -0
  190. package/cpp/core/src/languages/snowball/hungarian_stemmer.h +24 -0
  191. package/cpp/core/src/languages/snowball/indonesian_stemmer.c +443 -0
  192. package/cpp/core/src/languages/snowball/indonesian_stemmer.h +24 -0
  193. package/cpp/core/src/languages/snowball/irish_stemmer.c +428 -0
  194. package/cpp/core/src/languages/snowball/irish_stemmer.h +24 -0
  195. package/cpp/core/src/languages/snowball/italian_stemmer.c +983 -0
  196. package/cpp/core/src/languages/snowball/italian_stemmer.h +24 -0
  197. package/cpp/core/src/languages/snowball/lithuanian_stemmer.c +794 -0
  198. package/cpp/core/src/languages/snowball/lithuanian_stemmer.h +24 -0
  199. package/cpp/core/src/languages/snowball/nepali_stemmer.c +361 -0
  200. package/cpp/core/src/languages/snowball/nepali_stemmer.h +24 -0
  201. package/cpp/core/src/languages/snowball/norwegian_stemmer.c +332 -0
  202. package/cpp/core/src/languages/snowball/norwegian_stemmer.h +24 -0
  203. package/cpp/core/src/languages/snowball/persian_stemmer.c +538 -0
  204. package/cpp/core/src/languages/snowball/persian_stemmer.h +24 -0
  205. package/cpp/core/src/languages/snowball/polish_stemmer.c +501 -0
  206. package/cpp/core/src/languages/snowball/polish_stemmer.h +24 -0
  207. package/cpp/core/src/languages/snowball/portuguese_stemmer.c +866 -0
  208. package/cpp/core/src/languages/snowball/portuguese_stemmer.h +24 -0
  209. package/cpp/core/src/languages/snowball/romanian_stemmer.c +940 -0
  210. package/cpp/core/src/languages/snowball/romanian_stemmer.h +24 -0
  211. package/cpp/core/src/languages/snowball/russian_stemmer.c +598 -0
  212. package/cpp/core/src/languages/snowball/russian_stemmer.h +24 -0
  213. package/cpp/core/src/languages/snowball/serbian_stemmer.c +6765 -0
  214. package/cpp/core/src/languages/snowball/serbian_stemmer.h +24 -0
  215. package/cpp/core/src/languages/snowball/snowball_runtime.h +122 -0
  216. package/cpp/core/src/languages/snowball/spanish_stemmer.c +955 -0
  217. package/cpp/core/src/languages/snowball/spanish_stemmer.h +24 -0
  218. package/cpp/core/src/languages/snowball/swedish_stemmer.c +364 -0
  219. package/cpp/core/src/languages/snowball/swedish_stemmer.h +24 -0
  220. package/cpp/core/src/languages/snowball/tamil_stemmer.c +1305 -0
  221. package/cpp/core/src/languages/snowball/tamil_stemmer.h +24 -0
  222. package/cpp/core/src/languages/snowball/turkish_stemmer.c +1700 -0
  223. package/cpp/core/src/languages/snowball/turkish_stemmer.h +24 -0
  224. package/cpp/core/src/languages/snowball/utilities.c +716 -0
  225. package/cpp/core/src/languages/substitutions.c +131 -0
  226. package/cpp/core/src/languages/swahili_stemmer.c +85 -0
  227. package/cpp/core/src/languages/ukrainian_stemmer.c +168 -0
  228. package/cpp/core/src/locks.c +2 -15
  229. package/cpp/core/src/math/apply.c +44 -0
  230. package/cpp/core/src/math/fdlibm.h +16 -0
  231. package/cpp/core/src/math/inverse.c +242 -0
  232. package/cpp/core/src/math/log.c +90 -0
  233. package/cpp/core/src/math/reduce.c +325 -0
  234. package/cpp/core/src/math/trig.c +188 -0
  235. package/cpp/core/src/math/words.h +45 -0
  236. package/cpp/core/src/thread_yield.h +18 -0
  237. package/cpp/core/src/unicode/decompositions.c +310 -0
  238. package/cpp/core/src/unicode/lowercase.c +172 -0
  239. package/cpp/core/src/unicode/properties.c +214 -0
  240. package/cpp/core/src/workspace.c +5 -1
  241. package/lib/engine/analysis.d.ts +3 -0
  242. package/lib/engine/analysis.js +76 -0
  243. package/lib/engine/core.js +5 -0
  244. package/lib/engine/keyword.d.ts +3 -0
  245. package/lib/engine/keyword.js +25 -0
  246. package/lib/specs/core.nitro.d.ts +1 -0
  247. package/nitrogen/generated/shared/c++/HybridNarsilCoreSpec.cpp +1 -0
  248. package/nitrogen/generated/shared/c++/HybridNarsilCoreSpec.hpp +1 -0
  249. package/package.json +4 -3
  250. package/src/engine/analysis.ts +87 -0
  251. package/src/engine/core.ts +6 -0
  252. package/src/engine/keyword.ts +26 -0
  253. package/src/specs/core.nitro.ts +1 -0
@@ -0,0 +1,253 @@
1
+ #include "HostMemory.hpp"
2
+ #include "HybridNarsilCoreImpl.hpp"
3
+
4
+ #include <cerrno>
5
+ #include <cmath>
6
+ #include <cstdint>
7
+ #include <string>
8
+ #include <vector>
9
+
10
+ namespace margelo::nitro::narsil {
11
+
12
+ namespace {
13
+
14
+ enum KeywordArgument : size_t {
15
+ ARGUMENT_POOL_DOC_IDS,
16
+ ARGUMENT_POOL_FREQUENCIES,
17
+ ARGUMENT_POOL_FIELDS,
18
+ ARGUMENT_ROW_DOC_IDS,
19
+ ARGUMENT_ROW_FREQUENCIES,
20
+ ARGUMENT_ROW_FIELDS,
21
+ ARGUMENT_SLOTS,
22
+ ARGUMENT_LISTS,
23
+ ARGUMENT_LIST_VALUES,
24
+ ARGUMENT_SLOT_VALUES,
25
+ ARGUMENT_SEARCHABLE,
26
+ ARGUMENT_PARTIAL_MARKS,
27
+ ARGUMENT_NAME_RANKS,
28
+ ARGUMENT_FIELD_NUMBERS,
29
+ ARGUMENT_LENGTHS,
30
+ ARGUMENT_FILTER,
31
+ ARGUMENT_LIVE,
32
+ ARGUMENT_REMOVED,
33
+ ARGUMENT_SETTINGS,
34
+ ARGUMENT_ORDINALS,
35
+ ARGUMENT_SCORES,
36
+ ARGUMENT_MATCHED,
37
+ ARGUMENT_OUTCOME,
38
+ ARGUMENT_COUNT
39
+ };
40
+
41
+ static_assert(ARGUMENT_COUNT == KEYWORD_SCORE_ARGUMENT_COUNT);
42
+
43
+ enum Setting : size_t {
44
+ SETTING_SLOTS,
45
+ SETTING_TERMS,
46
+ SETTING_CAPACITY,
47
+ SETTING_TOTAL_DOCUMENTS,
48
+ SETTING_TERM_MATCH,
49
+ SETTING_ANCHOR,
50
+ SETTING_LIMIT,
51
+ SETTING_MIN_SCORE,
52
+ SETTING_COLLECT,
53
+ SETTING_COUNT
54
+ };
55
+
56
+ enum Outcome : size_t { OUTCOME_COUNT, OUTCOME_TOTAL_MATCHED, OUTCOME_SCORING_PATH };
57
+
58
+ constexpr uint32_t OUTCOME_MIN_LENGTH = OUTCOME_SCORING_PATH;
59
+
60
+ template <typename Element>
61
+ struct Elements {
62
+ Element* data;
63
+ uint32_t length;
64
+ };
65
+
66
+ size_t wholeProperty(jsi::Runtime& runtime, const jsi::Object& array, const char* name, const char* what) {
67
+ jsi::Value value = array.getProperty(runtime, name);
68
+ if (!value.isNumber()) throwInvalid(std::string(what) + " is not a typed array");
69
+ double number = value.getNumber();
70
+ if (!std::isfinite(number) || number < 0 || number > UINT32_MAX || std::floor(number) != number) {
71
+ throwInvalid(std::string(what) + " is not a typed array");
72
+ }
73
+ return static_cast<size_t>(number);
74
+ }
75
+
76
+ template <typename Element>
77
+ Elements<Element> elementsOf(jsi::Runtime& runtime, const jsi::Value& value, const char* what) {
78
+ if (!value.isObject()) throwInvalid(std::string(what) + " must be a typed array");
79
+ jsi::Object array = value.getObject(runtime);
80
+ if (wholeProperty(runtime, array, "BYTES_PER_ELEMENT", what) != sizeof(Element)) {
81
+ throwInvalid(std::string(what) + " holds elements of the wrong width");
82
+ }
83
+ jsi::Value bufferValue = array.getProperty(runtime, "buffer");
84
+ if (!bufferValue.isObject()) throwInvalid(std::string(what) + " has no buffer");
85
+ jsi::Object bufferObject = bufferValue.getObject(runtime);
86
+ if (!bufferObject.isArrayBuffer(runtime)) throwInvalid(std::string(what) + " has no buffer");
87
+ jsi::ArrayBuffer buffer = bufferObject.getArrayBuffer(runtime);
88
+ size_t offset = wholeProperty(runtime, array, "byteOffset", what);
89
+ size_t length = wholeProperty(runtime, array, "length", what);
90
+ size_t held = buffer.size(runtime);
91
+ if (offset > held || length > (held - offset) / sizeof(Element)) {
92
+ throwInvalid(std::string(what) + " reaches past the end of its buffer");
93
+ }
94
+ uint8_t* base = buffer.data(runtime);
95
+ if (base == nullptr) {
96
+ if (length > 0) throwInvalid(std::string(what) + " has a detached buffer");
97
+ return {nullptr, 0};
98
+ }
99
+ uint8_t* start = base + offset;
100
+ if (reinterpret_cast<uintptr_t>(start) % alignof(Element) != 0) throwInvalid(std::string(what) + " is misaligned");
101
+ return {reinterpret_cast<Element*>(start), static_cast<uint32_t>(length)};
102
+ }
103
+
104
+ uint32_t wholeCount(double value, const char* what) {
105
+ if (!(value >= 0) || value > UINT32_MAX || std::floor(value) != value) {
106
+ throwInvalid(std::string(what) + " must be a whole number from 0 to 4294967295");
107
+ }
108
+ return static_cast<uint32_t>(value);
109
+ }
110
+
111
+ uint32_t shorterOf(uint32_t first, uint32_t second) { return first < second ? first : second; }
112
+
113
+ void readRows(jsi::Runtime& runtime, const jsi::Value* arguments, narsil_keyword_request& request) {
114
+ auto poolDocIds = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_POOL_DOC_IDS], "The pool ordinals");
115
+ auto poolFrequencies =
116
+ elementsOf<const uint16_t>(runtime, arguments[ARGUMENT_POOL_FREQUENCIES], "The pool frequencies");
117
+ auto poolFields = elementsOf<const uint16_t>(runtime, arguments[ARGUMENT_POOL_FIELDS], "The pool fields");
118
+ auto rowDocIds = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_ROW_DOC_IDS], "The row ordinals");
119
+ auto rowFrequencies = elementsOf<const double>(runtime, arguments[ARGUMENT_ROW_FREQUENCIES], "The row frequencies");
120
+ auto rowFields = elementsOf<const uint16_t>(runtime, arguments[ARGUMENT_ROW_FIELDS], "The row fields");
121
+ request.pool_doc_ids = poolDocIds.data;
122
+ request.pool_frequencies = poolFrequencies.data;
123
+ request.pool_fields = poolFields.data;
124
+ request.pool_length = shorterOf(poolDocIds.length, shorterOf(poolFrequencies.length, poolFields.length));
125
+ request.row_doc_ids = rowDocIds.data;
126
+ request.row_frequencies = rowFrequencies.data;
127
+ request.row_fields = rowFields.data;
128
+ request.row_length = shorterOf(rowDocIds.length, shorterOf(rowFrequencies.length, rowFields.length));
129
+ }
130
+
131
+ void readSlots(jsi::Runtime& runtime, const jsi::Value* arguments, narsil_keyword_request& request) {
132
+ auto slots = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_SLOTS], "The slots");
133
+ auto lists = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_LISTS], "The lists");
134
+ auto listValues = elementsOf<const double>(runtime, arguments[ARGUMENT_LIST_VALUES], "The list values");
135
+ auto slotValues = elementsOf<const double>(runtime, arguments[ARGUMENT_SLOT_VALUES], "The slot values");
136
+ request.slots = slots.data;
137
+ request.slot_capacity = slots.length / NARSIL_KEYWORD_SLOT_STRIDE;
138
+ request.lists = lists.data;
139
+ request.list_values = listValues.data;
140
+ request.list_capacity = shorterOf(lists.length / NARSIL_KEYWORD_LIST_STRIDE,
141
+ listValues.length / NARSIL_KEYWORD_LIST_VALUE_STRIDE);
142
+ request.slot_values = slotValues.data;
143
+ request.slot_value_capacity = slotValues.length;
144
+ }
145
+
146
+ void readFields(jsi::Runtime& runtime, const jsi::Value* arguments, narsil_keyword_request& request) {
147
+ auto searchable = elementsOf<const uint8_t>(runtime, arguments[ARGUMENT_SEARCHABLE], "The searchable fields");
148
+ auto partialMarks = elementsOf<const uint8_t>(runtime, arguments[ARGUMENT_PARTIAL_MARKS], "The partial fields");
149
+ auto nameRanks = elementsOf<const uint16_t>(runtime, arguments[ARGUMENT_NAME_RANKS], "The field name ranks");
150
+ auto numbers = elementsOf<const double>(runtime, arguments[ARGUMENT_FIELD_NUMBERS], "The field numbers");
151
+ uint32_t count = searchable.length;
152
+ if (count > NARSIL_KEYWORD_MAX_FIELDS || partialMarks.length != count || nameRanks.length != count ||
153
+ static_cast<uint64_t>(numbers.length) != static_cast<uint64_t>(count) * NARSIL_KEYWORD_FIELD_NUMBER_COLUMNS) {
154
+ throwInvalid("The field columns of keywordScore disagree on the field count");
155
+ }
156
+ request.field_count = count;
157
+ request.searchable = searchable.data;
158
+ request.partial_marks = partialMarks.data;
159
+ request.name_ranks = nameRanks.data;
160
+ request.field_numbers = numbers.data;
161
+ }
162
+
163
+ void readLengths(jsi::Runtime& runtime, const jsi::Value& value, std::vector<narsil_keyword_column>& columns,
164
+ uint32_t count) {
165
+ if (!value.isObject() || !value.getObject(runtime).isArray(runtime)) {
166
+ throwInvalid("The field lengths must be a list");
167
+ }
168
+ jsi::Array list = value.getObject(runtime).getArray(runtime);
169
+ if (list.size(runtime) != count) throwInvalid("The field lengths hold one entry per field");
170
+ columns.resize(count);
171
+ for (uint32_t field = 0; field < count; field++) {
172
+ jsi::Value column = list.getValueAtIndex(runtime, field);
173
+ columns[field] = {nullptr, 0};
174
+ if (column.isNull()) continue;
175
+ auto lengths = elementsOf<const uint32_t>(runtime, column, "A field length column");
176
+ columns[field] = {lengths.data, lengths.length};
177
+ }
178
+ }
179
+
180
+ void readBitsets(jsi::Runtime& runtime, const jsi::Value* arguments, narsil_keyword_request& request) {
181
+ request.has_filter = !arguments[ARGUMENT_FILTER].isNull();
182
+ if (request.has_filter) {
183
+ auto filter = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_FILTER], "The filter");
184
+ request.filter = filter.data;
185
+ request.filter_words = filter.length;
186
+ }
187
+ auto live = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_LIVE], "The live ordinals");
188
+ auto removed = elementsOf<const uint32_t>(runtime, arguments[ARGUMENT_REMOVED], "The removed ordinals");
189
+ request.live = live.data;
190
+ request.live_words = live.length;
191
+ request.removed = removed.data;
192
+ request.removed_words = removed.length;
193
+ }
194
+
195
+ void readSettings(jsi::Runtime& runtime, const jsi::Value* arguments, narsil_keyword_request& request) {
196
+ auto settings = elementsOf<const double>(runtime, arguments[ARGUMENT_SETTINGS], "The settings");
197
+ if (settings.length < SETTING_COUNT) throwInvalid("The settings of keywordScore are too short");
198
+ const double* values = settings.data;
199
+ request.terms = values[SETTING_TERMS];
200
+ request.total_documents = values[SETTING_TOTAL_DOCUMENTS];
201
+ request.term_match = values[SETTING_TERM_MATCH];
202
+ request.limit = values[SETTING_LIMIT];
203
+ request.min_score = values[SETTING_MIN_SCORE];
204
+ request.collect = values[SETTING_COLLECT] != 0;
205
+ request.slot_count = wholeCount(values[SETTING_SLOTS], "The slot count");
206
+ request.capacity = wholeCount(values[SETTING_CAPACITY], "The capacity");
207
+ }
208
+
209
+ Elements<double> readOutput(jsi::Runtime& runtime, const jsi::Value* arguments, narsil_keyword_output& output) {
210
+ auto ordinals = elementsOf<int32_t>(runtime, arguments[ARGUMENT_ORDINALS], "The ordinals");
211
+ auto scores = elementsOf<double>(runtime, arguments[ARGUMENT_SCORES], "The scores");
212
+ auto matched = elementsOf<uint32_t>(runtime, arguments[ARGUMENT_MATCHED], "The matched ordinals");
213
+ auto outcome = elementsOf<double>(runtime, arguments[ARGUMENT_OUTCOME], "The outcome");
214
+ if (outcome.length < OUTCOME_MIN_LENGTH) throwInvalid("The outcome of keywordScore is too short");
215
+ output.ordinals = ordinals.data;
216
+ output.scores = scores.data;
217
+ output.length = shorterOf(ordinals.length, scores.length);
218
+ output.matched = matched.data;
219
+ output.matched_words = matched.length;
220
+ return outcome;
221
+ }
222
+
223
+ }
224
+
225
+ jsi::Value HybridNarsilCoreImpl::keywordScore(jsi::Runtime& runtime, const jsi::Value&, const jsi::Value* arguments,
226
+ size_t count) {
227
+ if (count != ARGUMENT_COUNT) throwInvalid("keywordScore takes twenty-three arguments");
228
+ narsil_keyword_request request{};
229
+ narsil_keyword_output output{};
230
+ readRows(runtime, arguments, request);
231
+ readSlots(runtime, arguments, request);
232
+ readBitsets(runtime, arguments, request);
233
+ readSettings(runtime, arguments, request);
234
+ Elements<double> outcome = readOutput(runtime, arguments, output);
235
+ readFields(runtime, arguments, request);
236
+ RuntimeState& state = stateOf(runtime);
237
+ readLengths(runtime, arguments[ARGUMENT_LENGTHS], state.keywordLengths, request.field_count);
238
+ request.lengths = state.keywordLengths.data();
239
+ if (state.keywordWorkspace == nullptr) {
240
+ narsil_workspace* created = nullptr;
241
+ if (narsil_workspace_create(&created) != NARSIL_OK) throwSystemError(ENOMEM, "allocate the keyword workspace", "");
242
+ state.keywordWorkspace.reset(created);
243
+ }
244
+ narsil_status status = narsil_keyword_score(state.keywordWorkspace.get(), &request, &output);
245
+ outcome.data[OUTCOME_COUNT] = static_cast<double>(output.count);
246
+ outcome.data[OUTCOME_TOTAL_MATCHED] = static_cast<double>(output.total_matched);
247
+ if (outcome.length > OUTCOME_SCORING_PATH) {
248
+ outcome.data[OUTCOME_SCORING_PATH] = static_cast<double>(output.scoring_path);
249
+ }
250
+ return jsi::Value(static_cast<double>(status));
251
+ }
252
+
253
+ }
@@ -0,0 +1,47 @@
1
+ #include "HostMemory.hpp"
2
+ #include "HybridNarsilCoreImpl.hpp"
3
+ #include "narsil_math.h"
4
+
5
+ #include <cmath>
6
+ #include <cstddef>
7
+ #include <cstdint>
8
+ #include <string>
9
+
10
+ namespace margelo::nitro::narsil {
11
+
12
+ namespace {
13
+
14
+ double* valuesOf(const MemoryView& view, const char* what, size_t* count) {
15
+ uint8_t* bytes = bytesWithin(view.buffer, view.byteOffset, view.byteLength, what);
16
+ size_t length = static_cast<size_t>(view.byteLength);
17
+ if ((bytes == nullptr && length > 0) || reinterpret_cast<uintptr_t>(bytes) % alignof(double) != 0 ||
18
+ length % sizeof(double) != 0) {
19
+ throwInvalid(std::string(what) + " must be a Float64Array");
20
+ }
21
+ *count = length / sizeof(double);
22
+ return reinterpret_cast<double*>(bytes);
23
+ }
24
+
25
+ }
26
+
27
+ double HybridNarsilCoreImpl::applyMath(double operation, const MemoryView& first, const MemoryView& second,
28
+ const MemoryView& results) {
29
+ if (!std::isfinite(operation) || operation < 0 || operation >= NARSIL_MATH_FUNCTION_COUNT ||
30
+ std::floor(operation) != operation) {
31
+ throwInvalid("The maths function must be an index from the core's header");
32
+ }
33
+ auto function = static_cast<narsil_math_function>(static_cast<int>(operation));
34
+ size_t firstCount = 0;
35
+ size_t secondCount = 0;
36
+ narsil_math_batch batch{};
37
+ batch.first = valuesOf(first, "The arguments", &firstCount);
38
+ const double* runs = valuesOf(second, "The second arguments", &secondCount);
39
+ batch.results = valuesOf(results, "The results", &batch.count);
40
+ if (firstCount != batch.count || (function == NARSIL_MATH_ATAN2 && secondCount != batch.count)) {
41
+ throwInvalid("The arguments and the results must hold the same number of values");
42
+ }
43
+ batch.second = function == NARSIL_MATH_ATAN2 ? runs : nullptr;
44
+ return static_cast<double>(narsil_math_apply(function, &batch));
45
+ }
46
+
47
+ }
@@ -0,0 +1,86 @@
1
+ #ifndef NARSIL_ANALYSIS_H
2
+ #define NARSIL_ANALYSIS_H
3
+
4
+ #include "narsil_core.h"
5
+
6
+ #include <stddef.h>
7
+ #include <stdint.h>
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif
12
+
13
+ #define NARSIL_ANALYSE_STEM (1U << 0)
14
+ #define NARSIL_ANALYSE_REMOVE_STOP_WORDS (1U << 1)
15
+ #define NARSIL_ANALYSE_REMOVE_DIACRITICS (1U << 2)
16
+ #define NARSIL_ANALYSE_COLLECT_SURFACES (1U << 3)
17
+ #define NARSIL_ANALYSE_SPELLINGS (1U << 4)
18
+ #define NARSIL_ANALYSE_FLAGS \
19
+ (NARSIL_ANALYSE_STEM | NARSIL_ANALYSE_REMOVE_STOP_WORDS | NARSIL_ANALYSE_REMOVE_DIACRITICS | \
20
+ NARSIL_ANALYSE_COLLECT_SURFACES)
21
+ #define NARSIL_TRANSFORM_FLAGS (NARSIL_ANALYSE_STEM | NARSIL_ANALYSE_REMOVE_DIACRITICS)
22
+ #define NARSIL_NO_SURFACE UINT32_MAX
23
+ #define NARSIL_NO_TERM_SLOT UINT32_MAX
24
+ #define NARSIL_MAX_ANALYSED_UNITS (1U << 30)
25
+
26
+ typedef struct narsil_analyser narsil_analyser;
27
+ typedef struct narsil_stop_word_set narsil_stop_word_set;
28
+
29
+ typedef struct {
30
+ uint32_t position;
31
+ uint32_t term_offset;
32
+ uint32_t term_length;
33
+ uint32_t surface_offset;
34
+ uint32_t surface_length;
35
+ uint32_t original_offset;
36
+ uint32_t original_length;
37
+ uint32_t term_slot;
38
+ } narsil_token;
39
+
40
+ typedef struct {
41
+ const narsil_token *tokens;
42
+ uint32_t token_count;
43
+ const uint16_t *units;
44
+ uint32_t unit_count;
45
+ } narsil_tokens;
46
+
47
+ typedef struct {
48
+ uint32_t language;
49
+ const narsil_stop_word_set *stop_words;
50
+ uint32_t flags;
51
+ const uint16_t *text;
52
+ uint32_t length;
53
+ } narsil_analysis_request;
54
+
55
+ uint32_t narsil_language_count(void);
56
+ narsil_status narsil_language_lookup(const char *name, size_t length, uint32_t *language);
57
+ const char *narsil_language_name(uint32_t language);
58
+ const char *narsil_language_revision(uint32_t language);
59
+
60
+ narsil_status narsil_analyser_create(narsil_analyser **analyser);
61
+ void narsil_analyser_destroy(narsil_analyser *analyser);
62
+
63
+ narsil_status narsil_stop_word_set_create(const uint16_t *units, const uint32_t *offsets, uint32_t count,
64
+ narsil_stop_word_set **set);
65
+ void narsil_stop_word_set_destroy(narsil_stop_word_set *set);
66
+
67
+ typedef struct {
68
+ const uint16_t *units;
69
+ uint32_t length;
70
+ } narsil_term;
71
+
72
+ narsil_status narsil_analyse(narsil_analyser *analyser, const narsil_analysis_request *request, narsil_tokens *tokens);
73
+ narsil_status narsil_transform(narsil_analyser *analyser, const narsil_analysis_request *request, narsil_term *term);
74
+ typedef struct {
75
+ const uint16_t *units;
76
+ const uint32_t *offsets;
77
+ uint32_t count;
78
+ } narsil_word_list;
79
+
80
+ narsil_status narsil_language_stop_words(uint32_t language, narsil_word_list *words);
81
+
82
+ #ifdef __cplusplus
83
+ }
84
+ #endif
85
+
86
+ #endif
@@ -8,7 +8,7 @@
8
8
  extern "C" {
9
9
  #endif
10
10
 
11
- #define NARSIL_CORE_ABI_VERSION 6
11
+ #define NARSIL_CORE_ABI_VERSION 8
12
12
 
13
13
  #define NARSIL_GRAPH_HEADER_WORDS 160
14
14
  #define NARSIL_STORE_HEADER_WORDS 16
@@ -0,0 +1,110 @@
1
+ #ifndef NARSIL_KEYWORD_H
2
+ #define NARSIL_KEYWORD_H
3
+
4
+ #include "narsil_core.h"
5
+
6
+ #include <stddef.h>
7
+ #include <stdint.h>
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif
12
+
13
+ #define NARSIL_KEYWORD_TERM_SLOT 0U
14
+ #define NARSIL_KEYWORD_GROUP_SLOT 1U
15
+ #define NARSIL_KEYWORD_PHRASE_SLOT 2U
16
+
17
+ #define NARSIL_KEYWORD_SLOT_STRIDE 4U
18
+ #define NARSIL_KEYWORD_SLOT_KIND 0U
19
+ #define NARSIL_KEYWORD_SLOT_TERM 1U
20
+ #define NARSIL_KEYWORD_SLOT_LIST_END 2U
21
+ #define NARSIL_KEYWORD_SLOT_VALUE_END 3U
22
+
23
+ #define NARSIL_KEYWORD_LIST_STRIDE 3U
24
+ #define NARSIL_KEYWORD_LIST_FLAGS 0U
25
+ #define NARSIL_KEYWORD_LIST_START 1U
26
+ #define NARSIL_KEYWORD_LIST_LENGTH 2U
27
+ #define NARSIL_KEYWORD_LIST_FROM_ROWS 1U
28
+ #define NARSIL_KEYWORD_LIST_ORDERED 2U
29
+
30
+ #define NARSIL_KEYWORD_LIST_VALUE_STRIDE 2U
31
+ #define NARSIL_KEYWORD_LIST_DOCUMENT_FREQUENCY 0U
32
+ #define NARSIL_KEYWORD_LIST_FACTOR 0U
33
+ #define NARSIL_KEYWORD_LIST_PARTIAL_FACTOR 1U
34
+
35
+ #define NARSIL_KEYWORD_FIELD_BOOSTS 0U
36
+ #define NARSIL_KEYWORD_FIELD_AVERAGE_LENGTHS 1U
37
+ #define NARSIL_KEYWORD_FIELD_K1 2U
38
+ #define NARSIL_KEYWORD_FIELD_B 3U
39
+ #define NARSIL_KEYWORD_FIELD_NUMBER_COLUMNS 4U
40
+
41
+ #define NARSIL_KEYWORD_SCORED_IN_FULL 0U
42
+ #define NARSIL_KEYWORD_PRUNED 1U
43
+ #define NARSIL_KEYWORD_PRUNED_THEN_FULL 2U
44
+
45
+ #define NARSIL_KEYWORD_NO_LIMIT (-1.0)
46
+ #define NARSIL_KEYWORD_MAX_FIELDS 65536U
47
+
48
+ typedef struct {
49
+ const uint32_t *values;
50
+ uint32_t length;
51
+ } narsil_keyword_column;
52
+
53
+ typedef struct {
54
+ const uint32_t *pool_doc_ids;
55
+ const uint16_t *pool_frequencies;
56
+ const uint16_t *pool_fields;
57
+ uint32_t pool_length;
58
+ const uint32_t *row_doc_ids;
59
+ const double *row_frequencies;
60
+ const uint16_t *row_fields;
61
+ uint32_t row_length;
62
+ const uint32_t *slots;
63
+ uint32_t slot_count;
64
+ uint32_t slot_capacity;
65
+ const uint32_t *lists;
66
+ const double *list_values;
67
+ uint32_t list_capacity;
68
+ const double *slot_values;
69
+ uint32_t slot_value_capacity;
70
+ uint32_t field_count;
71
+ const uint8_t *searchable;
72
+ const uint8_t *partial_marks;
73
+ const uint16_t *name_ranks;
74
+ const double *field_numbers;
75
+ const narsil_keyword_column *lengths;
76
+ int has_filter;
77
+ const uint32_t *filter;
78
+ uint32_t filter_words;
79
+ const uint32_t *live;
80
+ uint32_t live_words;
81
+ const uint32_t *removed;
82
+ uint32_t removed_words;
83
+ double terms;
84
+ uint32_t capacity;
85
+ double total_documents;
86
+ double term_match;
87
+ double limit;
88
+ double min_score;
89
+ int collect;
90
+ } narsil_keyword_request;
91
+
92
+ typedef struct {
93
+ int32_t *ordinals;
94
+ double *scores;
95
+ uint32_t length;
96
+ uint32_t *matched;
97
+ uint32_t matched_words;
98
+ uint32_t count;
99
+ uint32_t total_matched;
100
+ uint32_t scoring_path;
101
+ } narsil_keyword_output;
102
+
103
+ narsil_status narsil_keyword_score(narsil_workspace *workspace, const narsil_keyword_request *request,
104
+ narsil_keyword_output *output);
105
+
106
+ #ifdef __cplusplus
107
+ }
108
+ #endif
109
+
110
+ #endif
@@ -0,0 +1,36 @@
1
+ #ifndef NARSIL_MATH_H
2
+ #define NARSIL_MATH_H
3
+
4
+ #include "narsil_core.h"
5
+
6
+ #include <stddef.h>
7
+
8
+ #ifdef __cplusplus
9
+ extern "C" {
10
+ #endif
11
+
12
+ typedef enum {
13
+ NARSIL_MATH_LOG = 0,
14
+ NARSIL_MATH_SIN = 1,
15
+ NARSIL_MATH_COS = 2,
16
+ NARSIL_MATH_TAN = 3,
17
+ NARSIL_MATH_ASIN = 4,
18
+ NARSIL_MATH_ATAN = 5,
19
+ NARSIL_MATH_ATAN2 = 6,
20
+ NARSIL_MATH_FUNCTION_COUNT = 7,
21
+ } narsil_math_function;
22
+
23
+ typedef struct {
24
+ const double *first;
25
+ const double *second;
26
+ double *results;
27
+ size_t count;
28
+ } narsil_math_batch;
29
+
30
+ narsil_status narsil_math_apply(narsil_math_function function, const narsil_math_batch *batch);
31
+
32
+ #ifdef __cplusplus
33
+ }
34
+ #endif
35
+
36
+ #endif