cmpstr 3.2.1 → 3.3.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.
- package/README.md +24 -18
- package/dist/CmpStr.esm.js +1904 -1211
- package/dist/CmpStr.esm.min.js +2 -3
- package/dist/CmpStr.umd.js +1924 -1236
- package/dist/CmpStr.umd.min.js +2 -3
- package/dist/cjs/CmpStr.cjs +134 -64
- package/dist/cjs/CmpStrAsync.cjs +60 -37
- package/dist/cjs/index.cjs +1 -2
- package/dist/cjs/metric/Cosine.cjs +1 -2
- package/dist/cjs/metric/DamerauLevenshtein.cjs +1 -2
- package/dist/cjs/metric/DiceSorensen.cjs +1 -2
- package/dist/cjs/metric/Hamming.cjs +5 -4
- package/dist/cjs/metric/Jaccard.cjs +1 -2
- package/dist/cjs/metric/JaroWinkler.cjs +1 -2
- package/dist/cjs/metric/LCS.cjs +1 -2
- package/dist/cjs/metric/Levenshtein.cjs +1 -2
- package/dist/cjs/metric/Metric.cjs +90 -53
- package/dist/cjs/metric/NeedlemanWunsch.cjs +1 -2
- package/dist/cjs/metric/QGram.cjs +1 -2
- package/dist/cjs/metric/SmithWaterman.cjs +1 -2
- package/dist/cjs/phonetic/Caverphone.cjs +1 -2
- package/dist/cjs/phonetic/Cologne.cjs +1 -2
- package/dist/cjs/phonetic/Metaphone.cjs +1 -2
- package/dist/cjs/phonetic/Phonetic.cjs +80 -48
- package/dist/cjs/phonetic/Soundex.cjs +1 -2
- package/dist/cjs/root.cjs +6 -3
- package/dist/cjs/utils/DeepMerge.cjs +109 -99
- package/dist/cjs/utils/DiffChecker.cjs +1 -2
- package/dist/cjs/utils/Errors.cjs +106 -0
- package/dist/cjs/utils/Filter.cjs +97 -37
- package/dist/cjs/utils/HashTable.cjs +44 -30
- package/dist/cjs/utils/Normalizer.cjs +84 -35
- package/dist/cjs/utils/OptionsValidator.cjs +211 -0
- package/dist/cjs/utils/Pool.cjs +57 -19
- package/dist/cjs/utils/Profiler.cjs +41 -28
- package/dist/cjs/utils/Registry.cjs +48 -24
- package/dist/cjs/utils/StructuredData.cjs +95 -57
- package/dist/cjs/utils/TextAnalyzer.cjs +1 -2
- package/dist/esm/CmpStr.mjs +133 -61
- package/dist/esm/CmpStrAsync.mjs +56 -33
- package/dist/esm/index.mjs +1 -2
- package/dist/esm/metric/Cosine.mjs +1 -2
- package/dist/esm/metric/DamerauLevenshtein.mjs +1 -2
- package/dist/esm/metric/DiceSorensen.mjs +1 -2
- package/dist/esm/metric/Hamming.mjs +5 -4
- package/dist/esm/metric/Jaccard.mjs +1 -2
- package/dist/esm/metric/JaroWinkler.mjs +1 -2
- package/dist/esm/metric/LCS.mjs +1 -2
- package/dist/esm/metric/Levenshtein.mjs +1 -2
- package/dist/esm/metric/Metric.mjs +92 -53
- package/dist/esm/metric/NeedlemanWunsch.mjs +1 -2
- package/dist/esm/metric/QGram.mjs +1 -2
- package/dist/esm/metric/SmithWaterman.mjs +1 -2
- package/dist/esm/phonetic/Caverphone.mjs +1 -2
- package/dist/esm/phonetic/Cologne.mjs +1 -2
- package/dist/esm/phonetic/Metaphone.mjs +1 -2
- package/dist/esm/phonetic/Phonetic.mjs +83 -48
- package/dist/esm/phonetic/Soundex.mjs +1 -2
- package/dist/esm/root.mjs +5 -4
- package/dist/esm/utils/DeepMerge.mjs +109 -95
- package/dist/esm/utils/DiffChecker.mjs +1 -2
- package/dist/esm/utils/Errors.mjs +106 -0
- package/dist/esm/utils/Filter.mjs +97 -37
- package/dist/esm/utils/HashTable.mjs +44 -30
- package/dist/esm/utils/Normalizer.mjs +84 -35
- package/dist/esm/utils/OptionsValidator.mjs +210 -0
- package/dist/esm/utils/Pool.mjs +53 -19
- package/dist/esm/utils/Profiler.mjs +41 -28
- package/dist/esm/utils/Registry.mjs +48 -24
- package/dist/esm/utils/StructuredData.mjs +95 -57
- package/dist/esm/utils/TextAnalyzer.mjs +1 -2
- package/dist/types/CmpStr.d.ts +25 -14
- package/dist/types/CmpStrAsync.d.ts +4 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/metric/Metric.d.ts +15 -14
- package/dist/types/phonetic/Phonetic.d.ts +7 -4
- package/dist/types/root.d.ts +4 -2
- package/dist/types/utils/DeepMerge.d.ts +80 -58
- package/dist/types/utils/Errors.d.ts +154 -0
- package/dist/types/utils/Filter.d.ts +8 -1
- package/dist/types/utils/HashTable.d.ts +12 -11
- package/dist/types/utils/Normalizer.d.ts +5 -1
- package/dist/types/utils/OptionsValidator.d.ts +193 -0
- package/dist/types/utils/Pool.d.ts +2 -0
- package/dist/types/utils/Profiler.d.ts +9 -28
- package/dist/types/utils/Registry.d.ts +3 -3
- package/dist/types/utils/StructuredData.d.ts +6 -1
- package/dist/types/utils/Types.d.ts +39 -1
- package/package.json +20 -11
- package/dist/CmpStr.esm.js.map +0 -1
- package/dist/CmpStr.esm.min.js.map +0 -1
- package/dist/CmpStr.umd.js.map +0 -1
- package/dist/CmpStr.umd.min.js.map +0 -1
- package/dist/cjs/CmpStr.cjs.map +0 -1
- package/dist/cjs/CmpStrAsync.cjs.map +0 -1
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/metric/Cosine.cjs.map +0 -1
- package/dist/cjs/metric/DamerauLevenshtein.cjs.map +0 -1
- package/dist/cjs/metric/DiceSorensen.cjs.map +0 -1
- package/dist/cjs/metric/Hamming.cjs.map +0 -1
- package/dist/cjs/metric/Jaccard.cjs.map +0 -1
- package/dist/cjs/metric/JaroWinkler.cjs.map +0 -1
- package/dist/cjs/metric/LCS.cjs.map +0 -1
- package/dist/cjs/metric/Levenshtein.cjs.map +0 -1
- package/dist/cjs/metric/Metric.cjs.map +0 -1
- package/dist/cjs/metric/NeedlemanWunsch.cjs.map +0 -1
- package/dist/cjs/metric/QGram.cjs.map +0 -1
- package/dist/cjs/metric/SmithWaterman.cjs.map +0 -1
- package/dist/cjs/phonetic/Caverphone.cjs.map +0 -1
- package/dist/cjs/phonetic/Cologne.cjs.map +0 -1
- package/dist/cjs/phonetic/Metaphone.cjs.map +0 -1
- package/dist/cjs/phonetic/Phonetic.cjs.map +0 -1
- package/dist/cjs/phonetic/Soundex.cjs.map +0 -1
- package/dist/cjs/root.cjs.map +0 -1
- package/dist/cjs/utils/DeepMerge.cjs.map +0 -1
- package/dist/cjs/utils/DiffChecker.cjs.map +0 -1
- package/dist/cjs/utils/Filter.cjs.map +0 -1
- package/dist/cjs/utils/HashTable.cjs.map +0 -1
- package/dist/cjs/utils/Normalizer.cjs.map +0 -1
- package/dist/cjs/utils/Pool.cjs.map +0 -1
- package/dist/cjs/utils/Profiler.cjs.map +0 -1
- package/dist/cjs/utils/Registry.cjs.map +0 -1
- package/dist/cjs/utils/StructuredData.cjs.map +0 -1
- package/dist/cjs/utils/TextAnalyzer.cjs.map +0 -1
- package/dist/esm/CmpStr.mjs.map +0 -1
- package/dist/esm/CmpStrAsync.mjs.map +0 -1
- package/dist/esm/index.mjs.map +0 -1
- package/dist/esm/metric/Cosine.mjs.map +0 -1
- package/dist/esm/metric/DamerauLevenshtein.mjs.map +0 -1
- package/dist/esm/metric/DiceSorensen.mjs.map +0 -1
- package/dist/esm/metric/Hamming.mjs.map +0 -1
- package/dist/esm/metric/Jaccard.mjs.map +0 -1
- package/dist/esm/metric/JaroWinkler.mjs.map +0 -1
- package/dist/esm/metric/LCS.mjs.map +0 -1
- package/dist/esm/metric/Levenshtein.mjs.map +0 -1
- package/dist/esm/metric/Metric.mjs.map +0 -1
- package/dist/esm/metric/NeedlemanWunsch.mjs.map +0 -1
- package/dist/esm/metric/QGram.mjs.map +0 -1
- package/dist/esm/metric/SmithWaterman.mjs.map +0 -1
- package/dist/esm/phonetic/Caverphone.mjs.map +0 -1
- package/dist/esm/phonetic/Cologne.mjs.map +0 -1
- package/dist/esm/phonetic/Metaphone.mjs.map +0 -1
- package/dist/esm/phonetic/Phonetic.mjs.map +0 -1
- package/dist/esm/phonetic/Soundex.mjs.map +0 -1
- package/dist/esm/root.mjs.map +0 -1
- package/dist/esm/utils/DeepMerge.mjs.map +0 -1
- package/dist/esm/utils/DiffChecker.mjs.map +0 -1
- package/dist/esm/utils/Filter.mjs.map +0 -1
- package/dist/esm/utils/HashTable.mjs.map +0 -1
- package/dist/esm/utils/Normalizer.mjs.map +0 -1
- package/dist/esm/utils/Pool.mjs.map +0 -1
- package/dist/esm/utils/Profiler.mjs.map +0 -1
- package/dist/esm/utils/Registry.mjs.map +0 -1
- package/dist/esm/utils/StructuredData.mjs.map +0 -1
- package/dist/esm/utils/TextAnalyzer.mjs.map +0 -1
package/dist/cjs/CmpStrAsync.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var Errors = require('./utils/Errors.cjs');
|
|
4
5
|
var Filter = require('./utils/Filter.cjs');
|
|
5
6
|
var Normalizer = require('./utils/Normalizer.cjs');
|
|
6
7
|
var Registry = require('./utils/Registry.cjs');
|
|
@@ -45,27 +46,33 @@ class CmpStrAsync extends CmpStr.CmpStr {
|
|
|
45
46
|
async computeAsync(a, b, opt, mode, raw, skip) {
|
|
46
47
|
const resolved = this.resolveOptions(opt);
|
|
47
48
|
this.assert('metric', resolved.metric);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
49
|
+
return Errors.ErrorUtil.wrapAsync(
|
|
50
|
+
async () => {
|
|
51
|
+
const A = skip ? a : await this.prepareAsync(a, resolved);
|
|
52
|
+
const B = skip ? b : await this.prepareAsync(b, resolved);
|
|
53
|
+
if (
|
|
54
|
+
resolved.safeEmpty &&
|
|
55
|
+
((Array.isArray(A) && A.length === 0) ||
|
|
56
|
+
(Array.isArray(B) && B.length === 0) ||
|
|
57
|
+
A === '' ||
|
|
58
|
+
B === '')
|
|
59
|
+
) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const metric = Registry.factory['metric'](
|
|
63
|
+
resolved.metric,
|
|
64
|
+
A,
|
|
65
|
+
B,
|
|
66
|
+
resolved.opt
|
|
67
|
+
);
|
|
68
|
+
if (resolved.output !== 'prep') metric.setOriginal(a, b);
|
|
69
|
+
await metric.runAsync(mode);
|
|
70
|
+
const result = this.postProcess(metric.getResults(), resolved);
|
|
71
|
+
return this.output(result, raw ?? resolved.raw);
|
|
72
|
+
},
|
|
73
|
+
`Failed to compute metric <${opt?.metric ?? this.options.metric}> for the given inputs`,
|
|
74
|
+
{ a, b, opt }
|
|
64
75
|
);
|
|
65
|
-
if (resolved.output !== 'prep') metric.setOriginal(a, b);
|
|
66
|
-
await metric.runAsync(mode);
|
|
67
|
-
const result = this.postProcess(metric.getResults(), resolved);
|
|
68
|
-
return this.output(result, raw ?? resolved.raw);
|
|
69
76
|
}
|
|
70
77
|
async testAsync(a, b, opt) {
|
|
71
78
|
return this.computeAsync(a, b, opt, 'single');
|
|
@@ -103,23 +110,40 @@ class CmpStrAsync extends CmpStr.CmpStr {
|
|
|
103
110
|
const resolved = this.resolveOptions({ flags, processors });
|
|
104
111
|
const test = await this.prepareAsync(needle, resolved);
|
|
105
112
|
const hstk = await this.prepareAsync(haystack, resolved);
|
|
106
|
-
|
|
113
|
+
const out = [];
|
|
114
|
+
for (let i = 0; i < hstk.length; i++) {
|
|
115
|
+
if (hstk[i].includes(test)) out.push(haystack[i]);
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
107
118
|
}
|
|
108
119
|
async matrixAsync(input, opt) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
const resolved = this.resolveOptions(opt);
|
|
121
|
+
const arr = await this.prepareAsync(input, resolved);
|
|
122
|
+
const n = arr.length;
|
|
123
|
+
const out = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
124
|
+
for (let i = 0; i < n; i++) {
|
|
125
|
+
await Promise.all(
|
|
126
|
+
Array.from({ length: n - i }, (_, k) => i + k).map(async (j) => {
|
|
127
|
+
if (i === j) {
|
|
128
|
+
out[i][j] = 1;
|
|
129
|
+
} else {
|
|
130
|
+
const score = (
|
|
131
|
+
await this.computeAsync(
|
|
132
|
+
arr[i],
|
|
133
|
+
arr[j],
|
|
134
|
+
resolved,
|
|
135
|
+
'single',
|
|
136
|
+
true,
|
|
137
|
+
true
|
|
138
|
+
)
|
|
139
|
+
).res;
|
|
140
|
+
out[i][j] = score;
|
|
141
|
+
out[j][i] = score;
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
123
147
|
}
|
|
124
148
|
async phoneticIndexAsync(input, algo, opt) {
|
|
125
149
|
const { algo: a, opt: o } = this.options.processors?.phonetic ?? {};
|
|
@@ -165,4 +189,3 @@ class CmpStrAsync extends CmpStr.CmpStr {
|
|
|
165
189
|
}
|
|
166
190
|
|
|
167
191
|
exports.CmpStrAsync = CmpStrAsync;
|
|
168
|
-
//# sourceMappingURL=CmpStrAsync.cjs.map
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var CmpStr = require('./CmpStr.cjs');
|
|
@@ -12,4 +12,3 @@ exports.CmpStrAsync = CmpStrAsync.CmpStrAsync;
|
|
|
12
12
|
exports.DiffChecker = DiffChecker.DiffChecker;
|
|
13
13
|
exports.Normalizer = Normalizer.Normalizer;
|
|
14
14
|
exports.TextAnalyzer = TextAnalyzer.TextAnalyzer;
|
|
15
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -43,4 +43,3 @@ class CosineSimilarity extends Metric.Metric {
|
|
|
43
43
|
Metric.MetricRegistry.add('cosine', CosineSimilarity);
|
|
44
44
|
|
|
45
45
|
exports.CosineSimilarity = CosineSimilarity;
|
|
46
|
-
//# sourceMappingURL=Cosine.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -47,4 +47,3 @@ class DamerauLevenshteinDistance extends Metric.Metric {
|
|
|
47
47
|
Metric.MetricRegistry.add('damerau', DamerauLevenshteinDistance);
|
|
48
48
|
|
|
49
49
|
exports.DamerauLevenshteinDistance = DamerauLevenshteinDistance;
|
|
50
|
-
//# sourceMappingURL=DamerauLevenshtein.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -36,4 +36,3 @@ class DiceSorensenCoefficient extends Metric.Metric {
|
|
|
36
36
|
Metric.MetricRegistry.add('dice', DiceSorensenCoefficient);
|
|
37
37
|
|
|
38
38
|
exports.DiceSorensenCoefficient = DiceSorensenCoefficient;
|
|
39
|
-
//# sourceMappingURL=DiceSorensen.cjs.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Metric = require('./Metric.cjs');
|
|
5
|
+
var Errors = require('../utils/Errors.cjs');
|
|
5
6
|
|
|
6
7
|
class HammingDistance extends Metric.Metric {
|
|
7
8
|
constructor(a, b, opt = {}) {
|
|
@@ -14,9 +15,10 @@ class HammingDistance extends Metric.Metric {
|
|
|
14
15
|
if (n < maxLen) b = b.padEnd(maxLen, this.options.pad);
|
|
15
16
|
m = n = maxLen;
|
|
16
17
|
} else
|
|
17
|
-
throw new
|
|
18
|
+
throw new Errors.CmpStrUsageError(
|
|
18
19
|
`Strings must be of equal length for Hamming Distance, a=${m} and b=${n} given, ` +
|
|
19
|
-
`use option.pad for automatic adjustment
|
|
20
|
+
`use option.pad for automatic adjustment`,
|
|
21
|
+
{ a: m, b: n }
|
|
20
22
|
);
|
|
21
23
|
}
|
|
22
24
|
let dist = 0;
|
|
@@ -30,4 +32,3 @@ class HammingDistance extends Metric.Metric {
|
|
|
30
32
|
Metric.MetricRegistry.add('hamming', HammingDistance);
|
|
31
33
|
|
|
32
34
|
exports.HammingDistance = HammingDistance;
|
|
33
|
-
//# sourceMappingURL=Hamming.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -29,4 +29,3 @@ class JaccardIndex extends Metric.Metric {
|
|
|
29
29
|
Metric.MetricRegistry.add('jaccard', JaccardIndex);
|
|
30
30
|
|
|
31
31
|
exports.JaccardIndex = JaccardIndex;
|
|
32
|
-
//# sourceMappingURL=Jaccard.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -61,4 +61,3 @@ class JaroWinklerDistance extends Metric.Metric {
|
|
|
61
61
|
Metric.MetricRegistry.add('jaroWinkler', JaroWinklerDistance);
|
|
62
62
|
|
|
63
63
|
exports.JaroWinklerDistance = JaroWinklerDistance;
|
|
64
|
-
//# sourceMappingURL=JaroWinkler.cjs.map
|
package/dist/cjs/metric/LCS.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -36,4 +36,3 @@ class LCSMetric extends Metric.Metric {
|
|
|
36
36
|
Metric.MetricRegistry.add('lcs', LCSMetric);
|
|
37
37
|
|
|
38
38
|
exports.LCSMetric = LCSMetric;
|
|
39
|
-
//# sourceMappingURL=LCS.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -36,4 +36,3 @@ class LevenshteinDistance extends Metric.Metric {
|
|
|
36
36
|
Metric.MetricRegistry.add('levenshtein', LevenshteinDistance);
|
|
37
37
|
|
|
38
38
|
exports.LevenshteinDistance = LevenshteinDistance;
|
|
39
|
-
//# sourceMappingURL=Levenshtein.cjs.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var Errors = require('../utils/Errors.cjs');
|
|
4
5
|
var HashTable = require('../utils/HashTable.cjs');
|
|
5
6
|
var Profiler = require('../utils/Profiler.cjs');
|
|
6
7
|
var Registry = require('../utils/Registry.cjs');
|
|
@@ -17,15 +18,24 @@ class Metric {
|
|
|
17
18
|
optKey;
|
|
18
19
|
symmetric;
|
|
19
20
|
results;
|
|
20
|
-
static clear
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
static clear() {
|
|
22
|
+
this.cache.clear();
|
|
23
|
+
}
|
|
24
|
+
static swap(a, b, m, n) {
|
|
25
|
+
return m > n ? [b, a, n, m] : [a, b, m, n];
|
|
26
|
+
}
|
|
27
|
+
static clamp(res) {
|
|
28
|
+
return Math.max(0, Math.min(1, res));
|
|
29
|
+
}
|
|
23
30
|
constructor(metric, a, b, opt = {}, symmetric = false) {
|
|
24
31
|
this.metric = metric;
|
|
25
32
|
this.a = Array.isArray(a) ? a : [a];
|
|
26
33
|
this.b = Array.isArray(b) ? b : [b];
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
Errors.ErrorUtil.assert(
|
|
35
|
+
this.a.length > 0 && this.b.length > 0,
|
|
36
|
+
`Inputs <a> and <b> must not be empty`,
|
|
37
|
+
{ a: this.a, b: this.b }
|
|
38
|
+
);
|
|
29
39
|
this.options = opt;
|
|
30
40
|
this.optKey = HashTable.Hasher.fastFNV1a(
|
|
31
41
|
JSON.stringify(opt, Object.keys(opt).sort())
|
|
@@ -38,37 +48,46 @@ class Metric {
|
|
|
38
48
|
return undefined;
|
|
39
49
|
}
|
|
40
50
|
compute(a, b, m, n, maxLen) {
|
|
41
|
-
throw new
|
|
51
|
+
throw new Errors.CmpStrInternalError(
|
|
52
|
+
`Method compute() must be overridden in a subclass`
|
|
53
|
+
);
|
|
42
54
|
}
|
|
43
55
|
runSingle(i, j) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
56
|
+
return Errors.ErrorUtil.wrap(
|
|
57
|
+
() => {
|
|
58
|
+
let a = String(this.a[i]),
|
|
59
|
+
A = a;
|
|
60
|
+
let b = String(this.b[j]),
|
|
61
|
+
B = b;
|
|
62
|
+
let m = A.length,
|
|
63
|
+
n = B.length;
|
|
64
|
+
let result = this.preCompute(A, B, m, n);
|
|
65
|
+
if (!result) {
|
|
66
|
+
result = profiler.run(() => {
|
|
67
|
+
if (this.symmetric) [A, B, m, n] = Metric.swap(A, B, m, n);
|
|
68
|
+
let key = Metric.cache.key(this.metric, [A, B], this.symmetric);
|
|
69
|
+
if (key) key += this.optKey;
|
|
70
|
+
return (
|
|
71
|
+
Metric.cache.get(key || '') ??
|
|
72
|
+
(() => {
|
|
73
|
+
const maxLen = m > n ? m : n;
|
|
74
|
+
const res = this.compute(A, B, m, n, maxLen);
|
|
75
|
+
if (key) Metric.cache.set(key, res);
|
|
76
|
+
return res;
|
|
77
|
+
})()
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
metric: this.metric,
|
|
83
|
+
a: this.origA.length > i ? this.origA[i] : a,
|
|
84
|
+
b: this.origB.length > j ? this.origB[j] : b,
|
|
85
|
+
...result
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
`Failed to compute metric for inputs at indices a[${i}] and b[${j}]`,
|
|
89
|
+
{ i, j }
|
|
90
|
+
);
|
|
72
91
|
}
|
|
73
92
|
async runSingleAsync(i, j) {
|
|
74
93
|
return Promise.resolve(this.runSingle(i, j));
|
|
@@ -81,11 +100,11 @@ class Metric {
|
|
|
81
100
|
this.results = results;
|
|
82
101
|
}
|
|
83
102
|
async runBatchAsync() {
|
|
84
|
-
const
|
|
103
|
+
const tasks = [];
|
|
85
104
|
for (let i = 0; i < this.a.length; i++)
|
|
86
105
|
for (let j = 0; j < this.b.length; j++)
|
|
87
|
-
|
|
88
|
-
this.results =
|
|
106
|
+
tasks.push(this.runSingleAsync(i, j));
|
|
107
|
+
this.results = await Promise.all(tasks);
|
|
89
108
|
}
|
|
90
109
|
runPairwise() {
|
|
91
110
|
const results = [];
|
|
@@ -93,29 +112,42 @@ class Metric {
|
|
|
93
112
|
this.results = results;
|
|
94
113
|
}
|
|
95
114
|
async runPairwiseAsync() {
|
|
96
|
-
const
|
|
115
|
+
const tasks = [];
|
|
97
116
|
for (let i = 0; i < this.a.length; i++)
|
|
98
|
-
|
|
99
|
-
this.results =
|
|
117
|
+
tasks.push(this.runSingleAsync(i, i));
|
|
118
|
+
this.results = await Promise.all(tasks);
|
|
100
119
|
}
|
|
101
120
|
setOriginal(a, b) {
|
|
102
121
|
if (a) this.origA = Array.isArray(a) ? a : [a];
|
|
103
122
|
if (b) this.origB = Array.isArray(b) ? b : [b];
|
|
104
123
|
return this;
|
|
105
124
|
}
|
|
106
|
-
isBatch
|
|
107
|
-
|
|
125
|
+
isBatch() {
|
|
126
|
+
return this.a.length > 1 || this.b.length > 1;
|
|
127
|
+
}
|
|
128
|
+
isSingle() {
|
|
129
|
+
return !this.isBatch();
|
|
130
|
+
}
|
|
108
131
|
isPairwise(safe = false) {
|
|
109
132
|
return this.isBatch() && this.a.length === this.b.length
|
|
110
133
|
? true
|
|
111
134
|
: !safe &&
|
|
112
135
|
(() => {
|
|
113
|
-
throw new
|
|
136
|
+
throw new Errors.CmpStrUsageError(
|
|
137
|
+
`Mode <pairwise> requires arrays of equal length`,
|
|
138
|
+
{ a: this.a, b: this.b }
|
|
139
|
+
);
|
|
114
140
|
})();
|
|
115
141
|
}
|
|
116
|
-
isSymmetrical
|
|
117
|
-
|
|
118
|
-
|
|
142
|
+
isSymmetrical() {
|
|
143
|
+
return this.symmetric;
|
|
144
|
+
}
|
|
145
|
+
whichMode(mode) {
|
|
146
|
+
return mode ?? this.options.mode ?? 'default';
|
|
147
|
+
}
|
|
148
|
+
clear() {
|
|
149
|
+
this.results = undefined;
|
|
150
|
+
}
|
|
119
151
|
run(mode, clear = true) {
|
|
120
152
|
if (clear) this.clear();
|
|
121
153
|
switch (this.whichMode(mode)) {
|
|
@@ -134,7 +166,7 @@ class Metric {
|
|
|
134
166
|
if (this.isPairwise()) this.runPairwise();
|
|
135
167
|
break;
|
|
136
168
|
default:
|
|
137
|
-
throw new
|
|
169
|
+
throw new Errors.CmpStrInternalError(`Unsupported mode <${mode}>`);
|
|
138
170
|
}
|
|
139
171
|
}
|
|
140
172
|
async runAsync(mode, clear = true) {
|
|
@@ -155,13 +187,19 @@ class Metric {
|
|
|
155
187
|
if (this.isPairwise()) await this.runPairwiseAsync();
|
|
156
188
|
break;
|
|
157
189
|
default:
|
|
158
|
-
throw new
|
|
190
|
+
throw new Errors.CmpStrInternalError(
|
|
191
|
+
`Unsupported async mode <${mode}>`
|
|
192
|
+
);
|
|
159
193
|
}
|
|
160
194
|
}
|
|
161
|
-
getMetricName
|
|
195
|
+
getMetricName() {
|
|
196
|
+
return this.metric;
|
|
197
|
+
}
|
|
162
198
|
getResults() {
|
|
163
|
-
|
|
164
|
-
|
|
199
|
+
Errors.ErrorUtil.assert(
|
|
200
|
+
this.results !== undefined,
|
|
201
|
+
`run() must be called before getResults()`
|
|
202
|
+
);
|
|
165
203
|
return this.results;
|
|
166
204
|
}
|
|
167
205
|
}
|
|
@@ -169,4 +207,3 @@ const MetricRegistry = Registry.Registry('metric', Metric);
|
|
|
169
207
|
|
|
170
208
|
exports.Metric = Metric;
|
|
171
209
|
exports.MetricRegistry = MetricRegistry;
|
|
172
|
-
//# sourceMappingURL=Metric.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -43,4 +43,3 @@ class NeedlemanWunschDistance extends Metric.Metric {
|
|
|
43
43
|
Metric.MetricRegistry.add('needlemanWunsch', NeedlemanWunschDistance);
|
|
44
44
|
|
|
45
45
|
exports.NeedlemanWunschDistance = NeedlemanWunschDistance;
|
|
46
|
-
//# sourceMappingURL=NeedlemanWunsch.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -37,4 +37,3 @@ class QGramSimilarity extends Metric.Metric {
|
|
|
37
37
|
Metric.MetricRegistry.add('qGram', QGramSimilarity);
|
|
38
38
|
|
|
39
39
|
exports.QGramSimilarity = QGramSimilarity;
|
|
40
|
-
//# sourceMappingURL=QGram.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Pool = require('../utils/Pool.cjs');
|
|
@@ -44,4 +44,3 @@ class SmithWatermanDistance extends Metric.Metric {
|
|
|
44
44
|
Metric.MetricRegistry.add('smithWaterman', SmithWatermanDistance);
|
|
45
45
|
|
|
46
46
|
exports.SmithWatermanDistance = SmithWatermanDistance;
|
|
47
|
-
//# sourceMappingURL=SmithWaterman.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Phonetic = require('./Phonetic.cjs');
|
|
@@ -116,4 +116,3 @@ Phonetic.PhoneticMappingRegistry.add('caverphone', 'en2', {
|
|
|
116
116
|
});
|
|
117
117
|
|
|
118
118
|
exports.Caverphone = Caverphone;
|
|
119
|
-
//# sourceMappingURL=Caverphone.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Phonetic = require('./Phonetic.cjs');
|
|
@@ -67,4 +67,3 @@ Phonetic.PhoneticMappingRegistry.add('cologne', 'default', {
|
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
exports.Cologne = Cologne;
|
|
70
|
-
//# sourceMappingURL=Cologne.cjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// CmpStr v3.
|
|
1
|
+
// CmpStr v3.3.0 build-3699f85-260318 by Paul Köhler @komed3 / MIT License
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var Phonetic = require('./Phonetic.cjs');
|
|
@@ -97,4 +97,3 @@ Phonetic.PhoneticMappingRegistry.add('metaphone', 'en90', {
|
|
|
97
97
|
});
|
|
98
98
|
|
|
99
99
|
exports.Metaphone = Metaphone;
|
|
100
|
-
//# sourceMappingURL=Metaphone.cjs.map
|