puzlink 0.1.0

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 (233) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +35 -0
  3. package/dist/data/answerLengths.d.ts +10 -0
  4. package/dist/data/answerLengths.d.ts.map +1 -0
  5. package/dist/data/answerLengths.js +63 -0
  6. package/dist/data/answerLengths.js.map +1 -0
  7. package/dist/data/categories/compass.d.ts +3 -0
  8. package/dist/data/categories/compass.d.ts.map +1 -0
  9. package/dist/data/categories/compass.js +11 -0
  10. package/dist/data/categories/compass.js.map +1 -0
  11. package/dist/data/categories/countryAlpha2.d.ts +3 -0
  12. package/dist/data/categories/countryAlpha2.d.ts.map +1 -0
  13. package/dist/data/categories/countryAlpha2.js +252 -0
  14. package/dist/data/categories/countryAlpha2.js.map +1 -0
  15. package/dist/data/categories/countryAlpha3.d.ts +3 -0
  16. package/dist/data/categories/countryAlpha3.d.ts.map +1 -0
  17. package/dist/data/categories/countryAlpha3.js +252 -0
  18. package/dist/data/categories/countryAlpha3.js.map +1 -0
  19. package/dist/data/categories/daysOfTheWeek.d.ts +3 -0
  20. package/dist/data/categories/daysOfTheWeek.d.ts.map +1 -0
  21. package/dist/data/categories/daysOfTheWeek.js +10 -0
  22. package/dist/data/categories/daysOfTheWeek.js.map +1 -0
  23. package/dist/data/categories/elementSymbols.d.ts +3 -0
  24. package/dist/data/categories/elementSymbols.d.ts.map +1 -0
  25. package/dist/data/categories/elementSymbols.js +121 -0
  26. package/dist/data/categories/elementSymbols.js.map +1 -0
  27. package/dist/data/categories/greekLetters.d.ts +3 -0
  28. package/dist/data/categories/greekLetters.d.ts.map +1 -0
  29. package/dist/data/categories/greekLetters.js +27 -0
  30. package/dist/data/categories/greekLetters.js.map +1 -0
  31. package/dist/data/categories/months.d.ts +3 -0
  32. package/dist/data/categories/months.d.ts.map +1 -0
  33. package/dist/data/categories/months.js +15 -0
  34. package/dist/data/categories/months.js.map +1 -0
  35. package/dist/data/categories/natoAlphabet.d.ts +3 -0
  36. package/dist/data/categories/natoAlphabet.d.ts.map +1 -0
  37. package/dist/data/categories/natoAlphabet.js +29 -0
  38. package/dist/data/categories/natoAlphabet.js.map +1 -0
  39. package/dist/data/categories/numbers.d.ts +3 -0
  40. package/dist/data/categories/numbers.d.ts.map +1 -0
  41. package/dist/data/categories/numbers.js +16 -0
  42. package/dist/data/categories/numbers.js.map +1 -0
  43. package/dist/data/categories/romanNumerals.d.ts +3 -0
  44. package/dist/data/categories/romanNumerals.d.ts.map +1 -0
  45. package/dist/data/categories/romanNumerals.js +134 -0
  46. package/dist/data/categories/romanNumerals.js.map +1 -0
  47. package/dist/data/categories/solfege.d.ts +3 -0
  48. package/dist/data/categories/solfege.d.ts.map +1 -0
  49. package/dist/data/categories/solfege.js +11 -0
  50. package/dist/data/categories/solfege.js.map +1 -0
  51. package/dist/data/categories/usStateAbbreviations.d.ts +3 -0
  52. package/dist/data/categories/usStateAbbreviations.d.ts.map +1 -0
  53. package/dist/data/categories/usStateAbbreviations.js +53 -0
  54. package/dist/data/categories/usStateAbbreviations.js.map +1 -0
  55. package/dist/data/categories.d.ts +10 -0
  56. package/dist/data/categories.d.ts.map +1 -0
  57. package/dist/data/categories.js +31 -0
  58. package/dist/data/categories.js.map +1 -0
  59. package/dist/data/knownLogProbs.d.ts +6 -0
  60. package/dist/data/knownLogProbs.d.ts.map +1 -0
  61. package/dist/data/knownLogProbs.js +2975 -0
  62. package/dist/data/knownLogProbs.js.map +1 -0
  63. package/dist/data/morse.d.ts +2 -0
  64. package/dist/data/morse.d.ts.map +1 -0
  65. package/dist/data/morse.js +29 -0
  66. package/dist/data/morse.js.map +1 -0
  67. package/dist/data/scrabble.d.ts +2 -0
  68. package/dist/data/scrabble.d.ts.map +1 -0
  69. package/dist/data/scrabble.js +29 -0
  70. package/dist/data/scrabble.js.map +1 -0
  71. package/dist/features/index.d.ts +32 -0
  72. package/dist/features/index.d.ts.map +1 -0
  73. package/dist/features/index.js +79 -0
  74. package/dist/features/index.js.map +1 -0
  75. package/dist/features/letterCount.d.ts +7 -0
  76. package/dist/features/letterCount.d.ts.map +1 -0
  77. package/dist/features/letterCount.js +121 -0
  78. package/dist/features/letterCount.js.map +1 -0
  79. package/dist/features/letterSequence.d.ts +7 -0
  80. package/dist/features/letterSequence.d.ts.map +1 -0
  81. package/dist/features/letterSequence.js +155 -0
  82. package/dist/features/letterSequence.js.map +1 -0
  83. package/dist/features/logProbCache.d.ts +16 -0
  84. package/dist/features/logProbCache.d.ts.map +1 -0
  85. package/dist/features/logProbCache.js +36 -0
  86. package/dist/features/logProbCache.js.map +1 -0
  87. package/dist/features/other.d.ts +4 -0
  88. package/dist/features/other.d.ts.map +1 -0
  89. package/dist/features/other.js +190 -0
  90. package/dist/features/other.js.map +1 -0
  91. package/dist/features/substring.d.ts +3 -0
  92. package/dist/features/substring.d.ts.map +1 -0
  93. package/dist/features/substring.js +146 -0
  94. package/dist/features/substring.js.map +1 -0
  95. package/dist/features/wordplay.d.ts +7 -0
  96. package/dist/features/wordplay.d.ts.map +1 -0
  97. package/dist/features/wordplay.js +387 -0
  98. package/dist/features/wordplay.js.map +1 -0
  99. package/dist/index.d.ts +4 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +3 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/lib/affixDistribution.d.ts +26 -0
  104. package/dist/lib/affixDistribution.d.ts.map +1 -0
  105. package/dist/lib/affixDistribution.js +105 -0
  106. package/dist/lib/affixDistribution.js.map +1 -0
  107. package/dist/lib/counter.d.ts +23 -0
  108. package/dist/lib/counter.d.ts.map +1 -0
  109. package/dist/lib/counter.js +55 -0
  110. package/dist/lib/counter.js.map +1 -0
  111. package/dist/lib/distribution.d.ts +40 -0
  112. package/dist/lib/distribution.d.ts.map +1 -0
  113. package/dist/lib/distribution.js +176 -0
  114. package/dist/lib/distribution.js.map +1 -0
  115. package/dist/lib/lengthDistribution.d.ts +30 -0
  116. package/dist/lib/lengthDistribution.d.ts.map +1 -0
  117. package/dist/lib/lengthDistribution.js +137 -0
  118. package/dist/lib/lengthDistribution.js.map +1 -0
  119. package/dist/lib/letterBitset.d.ts +49 -0
  120. package/dist/lib/letterBitset.d.ts.map +1 -0
  121. package/dist/lib/letterBitset.js +101 -0
  122. package/dist/lib/letterBitset.js.map +1 -0
  123. package/dist/lib/letterDistribution.d.ts +60 -0
  124. package/dist/lib/letterDistribution.d.ts.map +1 -0
  125. package/dist/lib/letterDistribution.js +230 -0
  126. package/dist/lib/letterDistribution.js.map +1 -0
  127. package/dist/lib/letterIndices.d.ts +13 -0
  128. package/dist/lib/letterIndices.d.ts.map +1 -0
  129. package/dist/lib/letterIndices.js +41 -0
  130. package/dist/lib/letterIndices.js.map +1 -0
  131. package/dist/lib/logCounter.d.ts +23 -0
  132. package/dist/lib/logCounter.d.ts.map +1 -0
  133. package/dist/lib/logCounter.js +49 -0
  134. package/dist/lib/logCounter.js.map +1 -0
  135. package/dist/lib/logNum.d.ts +36 -0
  136. package/dist/lib/logNum.d.ts.map +1 -0
  137. package/dist/lib/logNum.js +193 -0
  138. package/dist/lib/logNum.js.map +1 -0
  139. package/dist/lib/memoize.d.ts +5 -0
  140. package/dist/lib/memoize.d.ts.map +1 -0
  141. package/dist/lib/memoize.js +104 -0
  142. package/dist/lib/memoize.js.map +1 -0
  143. package/dist/lib/util.d.ts +30 -0
  144. package/dist/lib/util.d.ts.map +1 -0
  145. package/dist/lib/util.js +111 -0
  146. package/dist/lib/util.js.map +1 -0
  147. package/dist/lib/wordlist.d.ts +66 -0
  148. package/dist/lib/wordlist.d.ts.map +1 -0
  149. package/dist/lib/wordlist.js +166 -0
  150. package/dist/lib/wordlist.js.map +1 -0
  151. package/dist/linkers/index.d.ts +34 -0
  152. package/dist/linkers/index.d.ts.map +1 -0
  153. package/dist/linkers/index.js +25 -0
  154. package/dist/linkers/index.js.map +1 -0
  155. package/dist/linkers/indexing.d.ts +5 -0
  156. package/dist/linkers/indexing.d.ts.map +1 -0
  157. package/dist/linkers/indexing.js +152 -0
  158. package/dist/linkers/indexing.js.map +1 -0
  159. package/dist/linkers/length.d.ts +5 -0
  160. package/dist/linkers/length.d.ts.map +1 -0
  161. package/dist/linkers/length.js +101 -0
  162. package/dist/linkers/length.js.map +1 -0
  163. package/dist/linkers/letterDistribution.d.ts +4 -0
  164. package/dist/linkers/letterDistribution.d.ts.map +1 -0
  165. package/dist/linkers/letterDistribution.js +46 -0
  166. package/dist/linkers/letterDistribution.js.map +1 -0
  167. package/dist/linkers/other.d.ts +5 -0
  168. package/dist/linkers/other.d.ts.map +1 -0
  169. package/dist/linkers/other.js +90 -0
  170. package/dist/linkers/other.js.map +1 -0
  171. package/dist/parse.d.ts +8 -0
  172. package/dist/parse.d.ts.map +1 -0
  173. package/dist/parse.js +23 -0
  174. package/dist/parse.js.map +1 -0
  175. package/dist/puzlink.d.ts +84 -0
  176. package/dist/puzlink.d.ts.map +1 -0
  177. package/dist/puzlink.js +59 -0
  178. package/dist/puzlink.js.map +1 -0
  179. package/package.json +57 -0
  180. package/src/data/answerLengths.ts +63 -0
  181. package/src/data/categories/README.md +3 -0
  182. package/src/data/categories/compass.ts +1 -0
  183. package/src/data/categories/countryAlpha2.ts +251 -0
  184. package/src/data/categories/countryAlpha3.ts +251 -0
  185. package/src/data/categories/daysOfTheWeek.ts +1 -0
  186. package/src/data/categories/elementSymbols.ts +120 -0
  187. package/src/data/categories/greekLetters.ts +26 -0
  188. package/src/data/categories/months.ts +14 -0
  189. package/src/data/categories/natoAlphabet.ts +28 -0
  190. package/src/data/categories/numbers.ts +15 -0
  191. package/src/data/categories/romanNumerals.ts +133 -0
  192. package/src/data/categories/solfege.ts +1 -0
  193. package/src/data/categories/txt/compass.txt +8 -0
  194. package/src/data/categories/txt/daysOfTheWeek.txt +7 -0
  195. package/src/data/categories/txt/elementSymbols.txt +118 -0
  196. package/src/data/categories/txt/greekLetters.txt +24 -0
  197. package/src/data/categories/txt/months.txt +12 -0
  198. package/src/data/categories/txt/natoAlphabet.txt +26 -0
  199. package/src/data/categories/txt/numbers.txt +13 -0
  200. package/src/data/categories/txt/solfege.txt +8 -0
  201. package/src/data/categories/txt/usStateAbbreviations.txt +50 -0
  202. package/src/data/categories/usStateAbbreviations.ts +52 -0
  203. package/src/data/categories.ts +42 -0
  204. package/src/data/knownLogProbs.ts +2992 -0
  205. package/src/data/morse.ts +28 -0
  206. package/src/data/scrabble.ts +28 -0
  207. package/src/features/index.ts +120 -0
  208. package/src/features/letterCount.ts +174 -0
  209. package/src/features/letterSequence.ts +222 -0
  210. package/src/features/logProbCache.ts +48 -0
  211. package/src/features/other.ts +214 -0
  212. package/src/features/substring.ts +173 -0
  213. package/src/features/wordplay.ts +428 -0
  214. package/src/index.ts +3 -0
  215. package/src/lib/affixDistribution.ts +70 -0
  216. package/src/lib/counter.ts +71 -0
  217. package/src/lib/distribution.ts +162 -0
  218. package/src/lib/lengthDistribution.ts +108 -0
  219. package/src/lib/letterBitset.ts +123 -0
  220. package/src/lib/letterDistribution.ts +236 -0
  221. package/src/lib/letterIndices.ts +51 -0
  222. package/src/lib/logCounter.ts +74 -0
  223. package/src/lib/logNum.ts +193 -0
  224. package/src/lib/memoize.ts +136 -0
  225. package/src/lib/testUtils.ts +1 -0
  226. package/src/lib/util.ts +150 -0
  227. package/src/lib/wordlist.ts +162 -0
  228. package/src/linkers/index.ts +56 -0
  229. package/src/linkers/indexing.ts +194 -0
  230. package/src/linkers/length.ts +122 -0
  231. package/src/linkers/other.ts +117 -0
  232. package/src/parse.ts +20 -0
  233. package/src/puzlink.ts +141 -0
@@ -0,0 +1,230 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { Distribution } from "./distribution.js";
36
+ import { LogCounter } from "./logCounter.js";
37
+ import { LogNum } from "./logNum.js";
38
+ import { memoize } from "./memoize.js";
39
+ import { caesar, interval } from "./util.js";
40
+ export const LETTERS = "abcdefghijklmnopqrstuvwxyz";
41
+ export const VOWELS = "aeiou";
42
+ export const CONSONANTS = "bcdfghjklmnpqrstvwxyz";
43
+ /**
44
+ * Info about the letter distribution of a wordlist.
45
+ *
46
+ * All of these methods rely on letters being drawn iid. This is the case for
47
+ * letters that come from random indexing. This is *not* the case for things
48
+ * like random substrings.
49
+ */
50
+ let LetterDistribution = (() => {
51
+ let _instanceExtraInitializers = [];
52
+ let _probConsecutive_decorators;
53
+ let _probDistinct_decorators;
54
+ let _probVowels_decorators;
55
+ let _probConsonants_decorators;
56
+ return class LetterDistribution {
57
+ static {
58
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
59
+ _probConsecutive_decorators = [memoize()];
60
+ _probDistinct_decorators = [memoize(2)];
61
+ _probVowels_decorators = [memoize()];
62
+ _probConsonants_decorators = [memoize()];
63
+ __esDecorate(this, null, _probConsecutive_decorators, { kind: "method", name: "probConsecutive", static: false, private: false, access: { has: obj => "probConsecutive" in obj, get: obj => obj.probConsecutive }, metadata: _metadata }, null, _instanceExtraInitializers);
64
+ __esDecorate(this, null, _probDistinct_decorators, { kind: "method", name: "probDistinct", static: false, private: false, access: { has: obj => "probDistinct" in obj, get: obj => obj.probDistinct }, metadata: _metadata }, null, _instanceExtraInitializers);
65
+ __esDecorate(this, null, _probVowels_decorators, { kind: "method", name: "probVowels", static: false, private: false, access: { has: obj => "probVowels" in obj, get: obj => obj.probVowels }, metadata: _metadata }, null, _instanceExtraInitializers);
66
+ __esDecorate(this, null, _probConsonants_decorators, { kind: "method", name: "probConsonants", static: false, private: false, access: { has: obj => "probConsonants" in obj, get: obj => obj.probConsonants }, metadata: _metadata }, null, _instanceExtraInitializers);
67
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
68
+ }
69
+ distribution = __runInitializers(this, _instanceExtraInitializers);
70
+ lengthToProbs;
71
+ constructor(wordlist) {
72
+ const letterCount = new Map();
73
+ let total = 0;
74
+ for (const word of wordlist) {
75
+ for (const letter of word) {
76
+ letterCount.set(letter, (letterCount.get(letter) ?? 0) + 1);
77
+ total++;
78
+ }
79
+ }
80
+ this.distribution = new Distribution(new Map(Array.from(letterCount.entries(), ([letter, count]) => [
81
+ letter,
82
+ LogNum.fromFraction(count, total),
83
+ ])));
84
+ this.lengthToProbs = new Map();
85
+ for (const word of wordlist) {
86
+ const prob = LogNum.prod(Array.from(word, (letter) => this.distribution.get(letter)));
87
+ const counts = new Map();
88
+ for (const letter of word) {
89
+ counts.set(letter, (counts.get(letter) ?? 0) + 1);
90
+ }
91
+ const perms = LogNum.fromFactorial(word.length).div(LogNum.prod(Array.from(counts.values(), (count) => LogNum.fromFactorial(count))));
92
+ if (!this.lengthToProbs.has(word.length)) {
93
+ this.lengthToProbs.set(word.length, {
94
+ word: LogNum.from(0),
95
+ anagram: LogNum.from(0),
96
+ });
97
+ }
98
+ this.lengthToProbs.get(word.length).word = this.lengthToProbs
99
+ .get(word.length)
100
+ .word.add(prob);
101
+ this.lengthToProbs.get(word.length).anagram = this.lengthToProbs
102
+ .get(word.length)
103
+ .anagram.add(prob.mul(perms));
104
+ }
105
+ }
106
+ /**
107
+ * Log probability that a list of letters is iid drawn from this distribution,
108
+ * via chi-squared.
109
+ */
110
+ probUnordered(letters) {
111
+ const counter = LogCounter.from(letters);
112
+ return this.distribution.probUnordered(counter);
113
+ }
114
+ /** Over- and under-represented letters, at 2 sigma. */
115
+ outliers(letters) {
116
+ const counter = LogCounter.from(letters);
117
+ const { high, low } = this.distribution.outliers(counter);
118
+ return { high: Object.keys(high), low: Object.keys(low) };
119
+ }
120
+ /**
121
+ * Log probability that words of given lengths share common letters, in the
122
+ * same order.
123
+ */
124
+ probCommonOrdered(common, lengths) {
125
+ if (common === 0) {
126
+ return LogNum.from(1);
127
+ }
128
+ const combos = LogNum.prod(interval(0, common - 1).flatMap((k) => lengths.map((length) => LogNum.fromFraction(length - k, k + 1))));
129
+ const p = this.distribution.moment(lengths.length).pow(common);
130
+ return LogNum.from(1).sub(LogNum.fromExp(-p.toNum() * combos.toNum()));
131
+ }
132
+ /** Log probability that k letters are all equal. */
133
+ probEqual(k) {
134
+ return this.distribution.probEqual(k);
135
+ }
136
+ /** Log probability that k letters are all equal, except for one. */
137
+ probAlmostEqual(k) {
138
+ return this.distribution.probAlmostEqual(k);
139
+ }
140
+ /** Log probability that k letters have exactly two values. */
141
+ probTwoDistinct(k) {
142
+ return this.distribution.probTwoDistinct(k);
143
+ }
144
+ /** Log probability that k letters are consecutive. */
145
+ probConsecutive(k) {
146
+ if (k <= 1) {
147
+ return LogNum.from(1);
148
+ }
149
+ else if (k > LETTERS.length) {
150
+ return LogNum.from(0);
151
+ }
152
+ const freqWindow = [];
153
+ for (const i of interval(1, k)) {
154
+ freqWindow.push(this.distribution.get(LETTERS[i]));
155
+ }
156
+ const partials = [];
157
+ for (let a = 1; a + k - 1 <= LETTERS.length; a++) {
158
+ partials.push(LogNum.prod(freqWindow));
159
+ freqWindow.shift();
160
+ freqWindow.push(this.distribution.get(LETTERS[a + k]));
161
+ }
162
+ return LogNum.fromFactorial(k).mul(LogNum.sum(partials));
163
+ }
164
+ /**
165
+ * Log probability that k letters have distinct values, all at least min.
166
+ */
167
+ probDistinct(k, min = "a") {
168
+ if (k <= 0) {
169
+ return LogNum.from(1);
170
+ }
171
+ else if (min > "z") {
172
+ return LogNum.from(0);
173
+ }
174
+ const probs = [];
175
+ for (const [letter, freq] of this.distribution.entries()) {
176
+ if (letter < min) {
177
+ continue;
178
+ }
179
+ probs.push(freq.mul(this.probDistinct(k - 1, caesar(letter, 1))));
180
+ }
181
+ return probs.length === 0
182
+ ? LogNum.from(0)
183
+ : LogNum.from(k).mul(LogNum.sum(probs));
184
+ }
185
+ /** Log probability that k letters can be grouped in equal pairs. */
186
+ probPaired(k) {
187
+ if (k % 2 !== 0) {
188
+ return LogNum.from(0);
189
+ }
190
+ return this.probDistinct(Math.floor(k / 2));
191
+ }
192
+ /** Log probability that k letters form a word. */
193
+ probWord(k) {
194
+ return this.lengthToProbs.get(k)?.word ?? LogNum.from(0);
195
+ }
196
+ /** Log probability that k letters form an anagram of a word. */
197
+ probAnagram(k) {
198
+ return this.lengthToProbs.get(k)?.anagram ?? LogNum.from(0);
199
+ }
200
+ /** Log probability that k letters are all vowels. */
201
+ probVowels(k) {
202
+ if (k === 0) {
203
+ return LogNum.from(1);
204
+ }
205
+ if (k === 1) {
206
+ return LogNum.sum(Array.from(VOWELS, (vowel) => this.distribution.get(vowel)));
207
+ }
208
+ return this.probVowels(1).pow(k);
209
+ }
210
+ /** Log probability that k letters are all consonants. */
211
+ probConsonants(k) {
212
+ if (k === 0) {
213
+ return LogNum.from(1);
214
+ }
215
+ if (k === 1) {
216
+ return LogNum.sum(Array.from(CONSONANTS, (consonant) => this.distribution.get(consonant)));
217
+ }
218
+ return this.probConsonants(1).pow(k);
219
+ }
220
+ /**
221
+ * Log probability that n words, each of length k, have the same pattern of
222
+ * vowels and consonants.
223
+ */
224
+ probEqualVowelPattern(n, k) {
225
+ return this.probVowels(k).add(this.probConsonants(k)).pow(n);
226
+ }
227
+ };
228
+ })();
229
+ export { LetterDistribution };
230
+ //# sourceMappingURL=letterDistribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"letterDistribution.js","sourceRoot":"","sources":["../../src/lib/letterDistribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** A map from letters to their indices in a given slug. */
2
+ export declare class LetterIndices {
3
+ private readonly indices;
4
+ constructor(indices: ReadonlyMap<string, number[]>);
5
+ static from(slug: string): LetterIndices;
6
+ counts(): IterableIterator<[string, number]>;
7
+ countSet(): Set<number>;
8
+ entries(): IterableIterator<[string, number[]]>;
9
+ filterKeys(fn: (letter: string, indices: number[]) => boolean): string[];
10
+ get(letter: string): number[];
11
+ keys(): IterableIterator<string>;
12
+ }
13
+ //# sourceMappingURL=letterIndices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"letterIndices.d.ts","sourceRoot":"","sources":["../../src/lib/letterIndices.ts"],"names":[],"mappings":"AAEA,2DAA2D;AAC3D,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAE5C,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAIlD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAavC,MAAM,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAM7C,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC;IAIvB,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAI/C,UAAU,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,GAAG,MAAM,EAAE;IAMxE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAI7B,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;CAGjC"}
@@ -0,0 +1,41 @@
1
+ import { enumerate } from "./util.js";
2
+ /** A map from letters to their indices in a given slug. */
3
+ export class LetterIndices {
4
+ indices;
5
+ constructor(indices) {
6
+ this.indices = indices;
7
+ }
8
+ static from(slug) {
9
+ const indices = new Map();
10
+ for (const [i, letter] of enumerate(slug)) {
11
+ if (!indices.has(letter)) {
12
+ indices.set(letter, []);
13
+ }
14
+ indices.get(letter).push(i);
15
+ }
16
+ return new LetterIndices(indices);
17
+ }
18
+ *counts() {
19
+ for (const [letter, indices] of this.indices.entries()) {
20
+ yield [letter, indices.length];
21
+ }
22
+ }
23
+ countSet() {
24
+ return new Set(Array.from(this.counts(), ([, c]) => c));
25
+ }
26
+ entries() {
27
+ return this.indices.entries();
28
+ }
29
+ filterKeys(fn) {
30
+ return Array.from(this.indices.entries())
31
+ .filter(([letter, indices]) => fn(letter, indices))
32
+ .map(([letter]) => letter);
33
+ }
34
+ get(letter) {
35
+ return this.indices.get(letter) ?? [];
36
+ }
37
+ keys() {
38
+ return this.indices.keys();
39
+ }
40
+ }
41
+ //# sourceMappingURL=letterIndices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"letterIndices.js","sourceRoot":"","sources":["../../src/lib/letterIndices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,2DAA2D;AAC3D,MAAM,OAAO,aAAa;IACP,OAAO,CAAgC;IAExD,YAAY,OAAsC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAE5C,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,CAAC,MAAM;QACL,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,UAAU,CAAC,EAAkD;QAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aAClD,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import { LogNum } from "./logNum.js";
2
+ /** A map from items to log counts. */
3
+ export declare class LogCounter<T extends PropertyKey> {
4
+ private readonly counts;
5
+ constructor(counts: ReadonlyMap<T, LogNum>, totalCache?: LogNum);
6
+ static from(data: string): LogCounter<string>;
7
+ static from<T extends PropertyKey>(data: Iterable<T>): LogCounter<T>;
8
+ static from<T extends PropertyKey, U>(data: Iterable<U>, map: (item: U) => T): LogCounter<T>;
9
+ /** The number of distinct items. */
10
+ get distinct(): LogNum;
11
+ private totalCache;
12
+ /** The total number of all items. */
13
+ get total(): LogNum;
14
+ /** The log count of the given item. */
15
+ get(item: T): LogNum;
16
+ /** Returns an iterable of [item, log count] pairs. */
17
+ entries(): IterableIterator<[T, LogNum]>;
18
+ /** Returns a list of items that satisfy the given predicate. */
19
+ filterKeys(fn: (item: T, count: LogNum) => boolean): T[];
20
+ /** Returns an iterable of [item, log probability] pairs. */
21
+ frequencies(): IterableIterator<[T, LogNum]>;
22
+ }
23
+ //# sourceMappingURL=logCounter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logCounter.d.ts","sourceRoot":"","sources":["../../src/lib/logCounter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,sCAAsC;AACtC,qBAAa,UAAU,CAAC,CAAC,SAAS,WAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAEpC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM;IAK/D,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjB,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAClB,UAAU,CAAC,CAAC,CAAC;IAsBhB,oCAAoC;IACpC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,OAAO,CAAC,UAAU,CAAqB;IAEvC,qCAAqC;IACrC,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,uCAAuC;IACvC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM;IAIpB,sDAAsD;IACtD,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAIxC,gEAAgE;IAChE,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,CAAC,EAAE;IAMxD,4DAA4D;IAC3D,WAAW,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;CAK9C"}
@@ -0,0 +1,49 @@
1
+ import { LogNum } from "./logNum.js";
2
+ /** A map from items to log counts. */
3
+ export class LogCounter {
4
+ counts;
5
+ constructor(counts, totalCache) {
6
+ this.counts = counts;
7
+ this.totalCache = totalCache;
8
+ }
9
+ static from(data, map) {
10
+ const counts = new Map();
11
+ let total = 0;
12
+ for (const item_ of data) {
13
+ const item = map ? map(item_) : item_;
14
+ counts.set(item, (counts.get(item) ?? 0) + 1);
15
+ total++;
16
+ }
17
+ return new LogCounter(new Map(Array.from(counts).map(([item, count]) => [item, LogNum.from(count)])), LogNum.from(total));
18
+ }
19
+ /** The number of distinct items. */
20
+ get distinct() {
21
+ return LogNum.from(this.counts.size);
22
+ }
23
+ totalCache;
24
+ /** The total number of all items. */
25
+ get total() {
26
+ return (this.totalCache ??= LogNum.sum(Array.from(this.counts.values())));
27
+ }
28
+ /** The log count of the given item. */
29
+ get(item) {
30
+ return this.counts.get(item) ?? LogNum.from(0);
31
+ }
32
+ /** Returns an iterable of [item, log count] pairs. */
33
+ entries() {
34
+ return this.counts.entries();
35
+ }
36
+ /** Returns a list of items that satisfy the given predicate. */
37
+ filterKeys(fn) {
38
+ return Array.from(this.counts.entries())
39
+ .filter(([item, count]) => fn(item, count))
40
+ .map(([item]) => item);
41
+ }
42
+ /** Returns an iterable of [item, log probability] pairs. */
43
+ *frequencies() {
44
+ for (const [item, count] of this.counts) {
45
+ yield [item, count.div(this.total)];
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=logCounter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logCounter.js","sourceRoot":"","sources":["../../src/lib/logCounter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,sCAAsC;AACtC,MAAM,OAAO,UAAU;IACJ,MAAM,CAAyB;IAEhD,YAAY,MAA8B,EAAE,UAAmB;QAC7D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAQD,MAAM,CAAC,IAAI,CACT,IAAoC,EACpC,GAAwC;QAExC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,KAAK,EAAE,CAAC;QACV,CAAC;QAED,OAAO,IAAI,UAAU,CACnB,IAAI,GAAG,CACL,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACtE,EACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CACnB,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAI,QAAQ;QACV,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEO,UAAU,CAAqB;IAEvC,qCAAqC;IACrC,IAAI,KAAK;QACP,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,uCAAuC;IACvC,GAAG,CAAC,IAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,sDAAsD;IACtD,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,gEAAgE;IAChE,UAAU,CAAC,EAAuC;QAChD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,4DAA4D;IAC5D,CAAC,WAAW;QACV,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * A numerically-stable-ish log of a non-negative number. Operations represent
3
+ * operations on the numbers, not the log numbers.
4
+ *
5
+ * @example LogNum.from(2).add(LogNum.from(3)).toNum() // 5
6
+ */
7
+ export declare class LogNum {
8
+ private readonly data;
9
+ /** Construct from the actual log number. */
10
+ constructor(data: number);
11
+ static from(value: number): LogNum;
12
+ static fromExp(value: number): LogNum;
13
+ static fromFraction(numerator: number, denominator: number): LogNum;
14
+ static fromBinomial(n: number, k: number): LogNum;
15
+ static fromZipf(zipf: number): LogNum;
16
+ static fromFactorial(n: number): LogNum;
17
+ toNum(): number;
18
+ toLog(): number;
19
+ exp(): LogNum;
20
+ log(): LogNum;
21
+ pow(power: number): LogNum;
22
+ mul(other: LogNum): LogNum;
23
+ div(other: LogNum): LogNum;
24
+ add(other: LogNum): LogNum;
25
+ absSub(other: LogNum): LogNum;
26
+ sub(other: LogNum): LogNum;
27
+ gt(other: LogNum): boolean;
28
+ lt(other: LogNum): boolean;
29
+ static max(values: LogNum[]): LogNum;
30
+ static min(values: LogNum[]): LogNum;
31
+ static sum(values: LogNum[]): LogNum;
32
+ static prod(values: LogNum[]): LogNum;
33
+ static binomialProb(successes: number, trials: number, frequency: LogNum): LogNum;
34
+ static binomialPValue(successes: number, trials: number, frequency: LogNum): LogNum;
35
+ }
36
+ //# sourceMappingURL=logNum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logNum.d.ts","sourceRoot":"","sources":["../../src/lib/logNum.ts"],"names":[],"mappings":"AAuBA;;;;;GAKG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,4CAA4C;gBAChC,IAAI,EAAE,MAAM;IAIxB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIlC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIrC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAKnE,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAQjD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIvC,KAAK,IAAI,MAAM;IAIf,KAAK,IAAI,MAAM;IAIf,GAAG,IAAI,MAAM;IAIb,GAAG,IAAI,MAAM;IAIb,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI1B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI1B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI1B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAW1B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ7B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAU1B,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI1B,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI1B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAIpC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAIpC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAWpC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAIrC,MAAM,CAAC,YAAY,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM;IAUT,MAAM,CAAC,cAAc,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM;CAoBV"}
@@ -0,0 +1,193 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { zipfToLogProb } from "cromulence";
36
+ import { gammaln } from "simple-statistics";
37
+ import { memoize } from "./memoize.js";
38
+ import { interval } from "./util.js";
39
+ /**
40
+ * A numerically-stable-ish log(1 - exp(x)).
41
+ *
42
+ * Follows the algorithm in <https://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf>.
43
+ */
44
+ function log1mExp(x) {
45
+ return x > -Math.log(2) ? Math.log1p(-Math.exp(x)) : Math.log(-Math.expm1(x));
46
+ }
47
+ /**
48
+ * A numerically-stable-ish log(1 + exp(x)).
49
+ *
50
+ * Follows the algorithm in <https://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf>.
51
+ */
52
+ function log1pExp(x) {
53
+ return x <= 18 ? Math.log1p(Math.exp(x)) : x + Math.exp(-x);
54
+ }
55
+ /**
56
+ * A numerically-stable-ish log of a non-negative number. Operations represent
57
+ * operations on the numbers, not the log numbers.
58
+ *
59
+ * @example LogNum.from(2).add(LogNum.from(3)).toNum() // 5
60
+ */
61
+ let LogNum = (() => {
62
+ let _staticExtraInitializers = [];
63
+ let _static_fromBinomial_decorators;
64
+ return class LogNum {
65
+ static {
66
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
67
+ __esDecorate(this, null, _static_fromBinomial_decorators, { kind: "method", name: "fromBinomial", static: true, private: false, access: { has: obj => "fromBinomial" in obj, get: obj => obj.fromBinomial }, metadata: _metadata }, null, _staticExtraInitializers);
68
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
69
+ __runInitializers(this, _staticExtraInitializers);
70
+ }
71
+ data;
72
+ /** Construct from the actual log number. */
73
+ constructor(data) {
74
+ this.data = data;
75
+ }
76
+ static from(value) {
77
+ return new LogNum(Math.log(value));
78
+ }
79
+ static fromExp(value) {
80
+ return new LogNum(value);
81
+ }
82
+ static fromFraction(numerator, denominator) {
83
+ return new LogNum(Math.log(numerator) - Math.log(denominator));
84
+ }
85
+ static fromBinomial(n, k) {
86
+ if (n === 0 || k === 0 || k === n) {
87
+ return LogNum.from(1);
88
+ }
89
+ return LogNum.fromBinomial(n - 1, k - 1).add(LogNum.fromBinomial(n - 1, k));
90
+ }
91
+ static fromZipf(zipf) {
92
+ return new LogNum(zipfToLogProb(zipf));
93
+ }
94
+ static fromFactorial(n) {
95
+ return new LogNum(gammaln(n + 1));
96
+ }
97
+ toNum() {
98
+ return Math.exp(this.data);
99
+ }
100
+ toLog() {
101
+ return this.data;
102
+ }
103
+ exp() {
104
+ return new LogNum(Math.exp(this.data));
105
+ }
106
+ log() {
107
+ return LogNum.from(this.data);
108
+ }
109
+ pow(power) {
110
+ return new LogNum(this.data * power);
111
+ }
112
+ mul(other) {
113
+ return new LogNum(this.data + other.data);
114
+ }
115
+ div(other) {
116
+ return new LogNum(this.data - other.data);
117
+ }
118
+ add(other) {
119
+ let [max, min] = [this.data, other.data];
120
+ if (max < min) {
121
+ [max, min] = [min, max];
122
+ }
123
+ if (min === -Infinity) {
124
+ return new LogNum(max);
125
+ }
126
+ return new LogNum(max + log1pExp(min - max));
127
+ }
128
+ absSub(other) {
129
+ let [max, min] = [this.data, other.data];
130
+ if (max < min) {
131
+ [max, min] = [min, max];
132
+ }
133
+ return new LogNum(max + log1mExp(min - max));
134
+ }
135
+ sub(other) {
136
+ if (this.lt(other)) {
137
+ throw new Error(`log underflow: ${this.data.toString()} - ${other.data.toString()}`);
138
+ }
139
+ const [max, min] = [this.data, other.data];
140
+ return new LogNum(max + log1mExp(min - max));
141
+ }
142
+ gt(other) {
143
+ return this.data > other.data;
144
+ }
145
+ lt(other) {
146
+ return this.data < other.data;
147
+ }
148
+ static max(values) {
149
+ return new LogNum(Math.max(...values.map((x) => x.data)));
150
+ }
151
+ static min(values) {
152
+ return new LogNum(Math.min(...values.map((x) => x.data)));
153
+ }
154
+ static sum(values) {
155
+ // Strip zeroes first:
156
+ values = values.filter((x) => x.data !== -Infinity);
157
+ const max = Math.max(...values.map((x) => x.data));
158
+ if (max === Infinity) {
159
+ return new LogNum(Infinity);
160
+ }
161
+ const expSum = values.reduce((acc, x) => acc + Math.exp(x.data - max), 0);
162
+ return new LogNum(max + Math.log(expSum));
163
+ }
164
+ static prod(values) {
165
+ return new LogNum(values.reduce((acc, x) => acc + x.data, 0));
166
+ }
167
+ static binomialProb(successes, trials, frequency) {
168
+ return LogNum.fromBinomial(trials, successes).mul(frequency.pow(successes).mul(LogNum.from(1)
169
+ .sub(frequency)
170
+ .pow(trials - successes)));
171
+ }
172
+ static binomialPValue(successes, trials, frequency) {
173
+ const expected = trials * frequency.toNum();
174
+ const probs = [];
175
+ if (successes > expected) {
176
+ for (const i of interval(successes, trials)) {
177
+ probs.push(LogNum.binomialProb(i, trials, frequency));
178
+ }
179
+ }
180
+ else {
181
+ for (const i of interval(0, successes)) {
182
+ probs.push(LogNum.binomialProb(i, trials, frequency));
183
+ }
184
+ }
185
+ return LogNum.sum(probs);
186
+ }
187
+ [(_static_fromBinomial_decorators = [memoize(2)], Symbol.for("nodejs.util.inspect.custom"))]() {
188
+ return `LogNum(${this.data.toFixed(3)}: ${this.toNum().toString()})`;
189
+ }
190
+ };
191
+ })();
192
+ export { LogNum };
193
+ //# sourceMappingURL=logNum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logNum.js","sourceRoot":"","sources":["../../src/lib/logNum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ type AnyFn = (...args: readonly any[]) => unknown;
2
+ /** Memoize a class method that takes up to three arguments. */
3
+ export declare function memoize<const Fn extends AnyFn>(levels?: 1 | 2 | 3): (target: Fn) => Fn;
4
+ export {};
5
+ //# sourceMappingURL=memoize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.d.ts","sourceRoot":"","sources":["../../src/lib/memoize.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,EAAE,KAAK,OAAO,CAAC;AA+HlD,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,KAAK,EAC5C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GACjB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC"}