@datagrok-libraries/utils 0.0.7 → 0.0.11

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 (43) hide show
  1. package/README.md +2 -2
  2. package/package.json +29 -29
  3. package/src/bit-array.d.ts +82 -0
  4. package/src/bit-array.d.ts.map +1 -0
  5. package/src/bit-array.js +666 -666
  6. package/src/operations.d.ts +66 -0
  7. package/src/operations.d.ts.map +1 -0
  8. package/src/operations.js +144 -144
  9. package/src/reduce-dimensionality.d.ts +38 -0
  10. package/src/reduce-dimensionality.d.ts.map +1 -0
  11. package/src/reduce-dimensionality.js +233 -233
  12. package/src/sequence-encoder.d.ts +59 -0
  13. package/src/sequence-encoder.d.ts.map +1 -0
  14. package/src/sequence-encoder.js +116 -117
  15. package/src/spe.d.ts +68 -0
  16. package/src/spe.d.ts.map +1 -0
  17. package/src/spe.js +151 -151
  18. package/src/string-measure.d.ts +33 -0
  19. package/src/string-measure.d.ts.map +1 -0
  20. package/src/string-measure.js +46 -46
  21. package/src/string-utils.d.ts +2 -0
  22. package/src/string-utils.d.ts.map +1 -0
  23. package/src/string-utils.js +9 -9
  24. package/src/table-validation.d.ts +2 -0
  25. package/src/table-validation.d.ts.map +1 -0
  26. package/src/table-validation.js +47 -47
  27. package/src/test-utils.d.ts +11 -0
  28. package/src/test-utils.d.ts.map +1 -0
  29. package/src/test-utils.js +81 -81
  30. package/src/{type_declarations.ts → type-declarations.d.ts} +56 -54
  31. package/src/type-declarations.d.ts.map +1 -0
  32. package/src/type-declarations.js +37 -0
  33. package/tsconfig.json +71 -71
  34. package/src/bit-array.ts +0 -767
  35. package/src/operations.ts +0 -160
  36. package/src/reduce-dimensionality.ts +0 -278
  37. package/src/sequence-encoder.ts +0 -132
  38. package/src/spe.ts +0 -172
  39. package/src/string-measure.ts +0 -54
  40. package/src/string-utils.ts +0 -8
  41. package/src/table-validation.ts +0 -67
  42. package/src/test-utils.ts +0 -97
  43. package/src/type_declarations.js +0 -37
package/src/spe.js CHANGED
@@ -1,151 +1,151 @@
1
- import { calculateEuclideanDistance, calcDistanceMatrix, fillRandomMatrix, vectorAdd, randomInt } from './operations';
2
- /**
3
- * Implements stochastic proximity embedding.
4
- *
5
- * @export
6
- * @class SPEBase
7
- * @link doi:10.1016/S1093-3263(03)00155-4
8
- */
9
- export class SPEBase {
10
- /**
11
- * Creates an instance of SPEBase.
12
- * @param {Options} [options] Options to pass to the constructor.
13
- * @memberof SPEBase
14
- */
15
- constructor(options) {
16
- var _a, _b, _c, _d, _e, _f, _g;
17
- this.steps = (_a = options === null || options === void 0 ? void 0 : options.steps) !== null && _a !== void 0 ? _a : 0;
18
- this.cycles = (_b = options === null || options === void 0 ? void 0 : options.cycles) !== null && _b !== void 0 ? _b : 1e6;
19
- // Select a cutoff distance {cutoff} and ...
20
- this.cutoff = (_c = options === null || options === void 0 ? void 0 : options.cutoff) !== null && _c !== void 0 ? _c : 0;
21
- // ... an initial learning rate {lambda} > 0
22
- this.lambda = (_d = options === null || options === void 0 ? void 0 : options.lambda) !== null && _d !== void 0 ? _d : 2.0;
23
- this.dlambda = (_e = options === null || options === void 0 ? void 0 : options.dlambda) !== null && _e !== void 0 ? _e : 0.01;
24
- this.lambda2 = this.lambda / 2.;
25
- this.dlambda2 = this.dlambda / 2.;
26
- this.epsilon = (_f = options === null || options === void 0 ? void 0 : options.epsilon) !== null && _f !== void 0 ? _f : 1e-10;
27
- // eslint-disable-next-line brace-style
28
- this.distanceFunction = (_g = options === null || options === void 0 ? void 0 : options.distance) !== null && _g !== void 0 ? _g : calculateEuclideanDistance;
29
- this.distance = [];
30
- }
31
- /**
32
- * Initializes distance matrix.
33
- *
34
- * @protected
35
- * @param {Vectors} vectors Input vectors to calculate distance between.
36
- * @memberof SPEBase
37
- */
38
- initDistance(vectors) {
39
- this.distance = calcDistanceMatrix(vectors, this.distanceFunction);
40
- }
41
- /**
42
- * Calculates distance between the two vectors given.
43
- *
44
- * @param {Vectors} vectors Set of vectors to calculate distances between.
45
- * @param {number} index1 Index of the first vector of the pair.
46
- * @param {number} index2 Index of the second vector of the pair.
47
- * @return {number} Distance between these two vectors.
48
- */
49
- calcDistance(vectors, index1, index2) {
50
- return this.distance[index1][index2];
51
- }
52
- /**
53
- * Embeds the vectors given into a two-dimensional space.
54
- *
55
- * @param {Vectors} vectors D-dimensional coordinates.
56
- * @return {Coordinates} SPE coordinates in D space.
57
- */
58
- embed(vectors) {
59
- const nItems = vectors.length;
60
- const areaWidth = 40;
61
- // Initialize the D-dimensional coordinates of the N points.
62
- const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);
63
- let lambda2 = this.lambda2;
64
- if (this.steps == 0) {
65
- this.steps = vectors.length - 1;
66
- }
67
- this.initDistance(vectors);
68
- for (let cycle = 0; cycle < this.cycles; ++cycle) {
69
- for (let step = 0; step < this.steps; ++step) {
70
- // Select two points, i and j, at random, ...
71
- const i = randomInt(nItems);
72
- let j = randomInt(nItems);
73
- while (i == j)
74
- j = randomInt(nItems);
75
- const rowi = coordinates[i];
76
- const rowj = coordinates[j];
77
- // ... retrieve (or evaluate) their proximity in the input space, rij and ...
78
- const r = this.calcDistance(vectors, i, j);
79
- // ... compute their Euclidean distance on the D-dimensional map, dij.
80
- const d = calculateEuclideanDistance(rowi, rowj);
81
- // If rij <= rc, or if rij > rc and dij < rij ...
82
- if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {
83
- const multiplier = lambda2 * (r - d) / (d + this.epsilon);
84
- // ... update the coordinates xi and xj.
85
- const diffIJ = vectorAdd(rowi, rowj, -1);
86
- coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);
87
- coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);
88
- }
89
- }
90
- // Decrease the learning rate {lambda} by a prescribed {dlambda}.
91
- lambda2 -= this.dlambda2;
92
- if (lambda2 <= 0.) {
93
- break;
94
- }
95
- }
96
- return coordinates;
97
- }
98
- }
99
- SPEBase.dimension = 2;
100
- /**
101
- * Implements modified stochastic proximity embedding.
102
- *
103
- * @export
104
- * @class PSPEBase
105
- * @link doi:10.1016/S1093-3263(03)00155-4
106
- */
107
- export class PSPEBase extends SPEBase {
108
- /**
109
- * Embeds the vectors given into a two-dimensional space using a modified update rule.
110
- *
111
- * @param {Vectors} vectors D-dimensional coordinates.
112
- * @return {Coordinates} SPE coordinates in D space.
113
- */
114
- embed(vectors) {
115
- const nItems = vectors.length;
116
- const areaWidth = 40;
117
- // Initialize the D-dimensional coordinates of the N points.
118
- const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);
119
- let lambda = this.lambda;
120
- this.initDistance(vectors);
121
- for (let cycle = 0; cycle < this.cycles; ++cycle) {
122
- // Select a point, i, at random (pivot).
123
- const i = randomInt(nItems);
124
- const rowi = coordinates[i];
125
- // For every point j != i ...
126
- for (let j = 0; j < nItems; ++j) {
127
- if (i == j)
128
- continue;
129
- const rowj = coordinates[j];
130
- // ... retrieve (or evaluate) its proximity to i in the input space, rij ...
131
- const r = this.calcDistance(vectors, i, j);
132
- // ... and compute their Euclidean distance on the D-dimensional map, dij.
133
- const d = calculateEuclideanDistance(rowi, rowj);
134
- // If rij <= rc, or if rij > rc and dij < rij ...
135
- if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {
136
- const multiplier = lambda * (r - d) / (d + this.epsilon);
137
- const diffIJ = vectorAdd(rowi, rowj, -1);
138
- // ... update the coordinates xj.
139
- coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);
140
- }
141
- }
142
- // Decrease the learning rate {lambda} by a prescribed {dlambda}.
143
- lambda -= this.dlambda;
144
- if (lambda <= 0.) {
145
- break;
146
- }
147
- }
148
- return coordinates;
149
- }
150
- }
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBYWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCOztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssbUNBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUM7UUFDbkMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLElBQUksQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLEtBQUssQ0FBQztRQUN6Qyx1Q0FBdUM7UUFDdkMsSUFB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QUE0RTtnQkFDNUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQywwRUFBMEU7Z0JBQzFFLE1BQU0sQ0FBQyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2pELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLGlDQUFpQztvQkFDakMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0Y7WUFDRCxpRUFBaUU7WUFDakUsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdkIsSUFBSSxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUNoQixNQUFNO2FBQ1A7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3B0aW9ucywgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGVfZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHtjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSwgY2FsY0Rpc3RhbmNlTWF0cml4LCBmaWxsUmFuZG9tTWF0cml4LCB2ZWN0b3JBZGQsIHJhbmRvbUludH0gZnJvbSAnLi9vcGVyYXRpb25zJztcclxuXHJcbi8qKlxyXG4gKiBJbXBsZW1lbnRzIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgU1BFQmFzZVxyXG4gKiBAbGluayBkb2k6MTAuMTAxNi9TMTA5My0zMjYzKDAzKTAwMTU1LTRcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTUEVCYXNlIHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRpbWVuc2lvbiA9IDI7XHJcbiAgcHJvdGVjdGVkIHN0ZXBzOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIGN5Y2xlczogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBjdXRvZmY6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgbGFtYmRhOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIGRsYW1iZGE6IG51bWJlcjtcclxuICBwcm90ZWN0ZWQgbGFtYmRhMjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBkbGFtYmRhMjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIGRpc3RhbmNlRnVuY3Rpb246IERpc3RhbmNlTWV0cmljO1xyXG4gIHByb3RlY3RlZCBkaXN0YW5jZTogQ29vcmRpbmF0ZXM7XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU1BFQmFzZS5cclxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAqIEBtZW1iZXJvZiBTUEVCYXNlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcclxuICAgIHRoaXMuc3RlcHMgPSBvcHRpb25zPy5zdGVwcyA/PyAwO1xyXG4gICAgdGhpcy5jeWNsZXMgPSBvcHRpb25zPy5jeWNsZXMgPz8gMWU2O1xyXG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cclxuICAgIHRoaXMuY3V0b2ZmID0gb3B0aW9ucz8uY3V0b2ZmID8/IDA7XHJcbiAgICAvLyAuLi4gYW4gaW5pdGlhbCBsZWFybmluZyByYXRlIHtsYW1iZGF9ID4gMFxyXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xyXG4gICAgdGhpcy5kbGFtYmRhID0gb3B0aW9ucz8uZGxhbWJkYSA/PyAwLjAxO1xyXG4gICAgdGhpcy5sYW1iZGEyID0gdGhpcy5sYW1iZGEvMi47XHJcbiAgICB0aGlzLmRsYW1iZGEyID0gdGhpcy5kbGFtYmRhLzIuO1xyXG4gICAgdGhpcy5lcHNpbG9uID0gb3B0aW9ucz8uZXBzaWxvbiA/PyAxZS0xMDtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBicmFjZS1zdHlsZVxyXG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uID0gb3B0aW9ucz8uZGlzdGFuY2UgPz8gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2U7XHJcbiAgICB0aGlzLmRpc3RhbmNlID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyBkaXN0YW5jZSBtYXRyaXguXHJcbiAgICpcclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4uXHJcbiAgICogQG1lbWJlcm9mIFNQRUJhc2VcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgaW5pdERpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMpIHtcclxuICAgIHRoaXMuZGlzdGFuY2UgPSBjYWxjRGlzdGFuY2VNYXRyaXgodmVjdG9ycywgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHZlY3RvcnMgZ2l2ZW4uXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIFNldCBvZiB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMgYmV0d2Vlbi5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgxIEluZGV4IG9mIHRoZSBmaXJzdCB2ZWN0b3Igb2YgdGhlIHBhaXIuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiBJbmRleCBvZiB0aGUgc2Vjb25kIHZlY3RvciBvZiB0aGUgcGFpci5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIGJldHdlZW4gdGhlc2UgdHdvIHZlY3RvcnMuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGNhbGNEaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VbaW5kZXgxXVtpbmRleDJdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1iZWRzIHRoZSB2ZWN0b3JzIGdpdmVuIGludG8gYSB0d28tZGltZW5zaW9uYWwgc3BhY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMuXHJcbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBlbWJlZCh2ZWN0b3JzOiBWZWN0b3JzKTogQ29vcmRpbmF0ZXMge1xyXG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XHJcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcclxuICAgIC8vIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxyXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XHJcblxyXG4gICAgbGV0IGxhbWJkYTIgPSB0aGlzLmxhbWJkYTI7XHJcblxyXG4gICAgaWYgKHRoaXMuc3RlcHMgPT0gMCkge1xyXG4gICAgICB0aGlzLnN0ZXBzID0gdmVjdG9ycy5sZW5ndGgtMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcclxuXHJcbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcclxuICAgICAgZm9yIChsZXQgc3RlcCA9IDA7IHN0ZXAgPCB0aGlzLnN0ZXBzOyArK3N0ZXApIHtcclxuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cclxuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7IGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XHJcbiAgICAgICAgd2hpbGUgKGkgPT0gaikgaiA9IHJhbmRvbUludChuSXRlbXMpO1xyXG5cclxuICAgICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07IGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcclxuXHJcbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgdGhlaXIgcHJveGltaXR5IGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIGFuZCAuLi5cclxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XHJcbiAgICAgICAgLy8gLi4uIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxyXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcclxuXHJcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxyXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcclxuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEyKihyLWQpLyhkK3RoaXMuZXBzaWxvbik7XHJcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4aSBhbmQgeGouXHJcbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xyXG4gICAgICAgICAgY29vcmRpbmF0ZXNbaV0gPSB2ZWN0b3JBZGQocm93aSwgZGlmZklKLCBtdWx0aXBsaWVyKTtcclxuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxyXG4gICAgICBsYW1iZGEyIC09IHRoaXMuZGxhbWJkYTI7XHJcbiAgICAgIGlmIChsYW1iZGEyIDw9IDAuKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb29yZGluYXRlcztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgUFNQRUJhc2VcclxuICogQGxpbmsgZG9pOjEwLjEwMTYvUzEwOTMtMzI2MygwMykwMDE1NS00XHJcbiAqL1xyXG4gZXhwb3J0IGNsYXNzIFBTUEVCYXNlIGV4dGVuZHMgU1BFQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogRW1iZWRzIHRoZSB2ZWN0b3JzIGdpdmVuIGludG8gYSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgYSBtb2RpZmllZCB1cGRhdGUgcnVsZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cclxuICAgKiBAcmV0dXJuIHtDb29yZGluYXRlc30gU1BFIGNvb3JkaW5hdGVzIGluIEQgc3BhY2UuXHJcbiAgICovXHJcbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XHJcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcclxuICAgIGNvbnN0IGFyZWFXaWR0aCA9IDQwO1xyXG4gICAgLy8gIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxyXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgUFNQRUJhc2UuZGltZW5zaW9uLCBhcmVhV2lkdGgpO1xyXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xyXG5cclxuICAgIHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xyXG5cclxuICAgIGZvciAobGV0IGN5Y2xlID0gMDsgY3ljbGUgPCB0aGlzLmN5Y2xlczsgKytjeWNsZSkge1xyXG4gICAgICAvLyBTZWxlY3QgYSBwb2ludCwgaSwgYXQgcmFuZG9tIChwaXZvdCkuXHJcbiAgICAgIGNvbnN0IGk6IG51bWJlciA9IHJhbmRvbUludChuSXRlbXMpO1xyXG4gICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XHJcblxyXG4gICAgICAvLyBGb3IgZXZlcnkgcG9pbnQgaiAhPSBpIC4uLlxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5JdGVtczsgKytqKSB7XHJcbiAgICAgICAgaWYgKGkgPT0gaikgY29udGludWU7XHJcbiAgICAgICAgY29uc3Qgcm93aiA9IGNvb3JkaW5hdGVzW2pdO1xyXG4gICAgICAgIC8vIC4uLiByZXRyaWV2ZSAob3IgZXZhbHVhdGUpIGl0cyBwcm94aW1pdHkgdG8gaSBpbiB0aGUgaW5wdXQgc3BhY2UsIHJpaiAuLi5cclxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XHJcbiAgICAgICAgLy8gLi4uIGFuZCBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cclxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XHJcbiAgICAgICAgLy8gSWYgcmlqIDw9IHJjLCBvciBpZiByaWogPiByYyBhbmQgZGlqIDwgcmlqIC4uLlxyXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcclxuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEqKHItZCkvKGQrdGhpcy5lcHNpbG9uKTtcclxuICAgICAgICAgIGNvbnN0IGRpZmZJSiA9IHZlY3RvckFkZChyb3dpLCByb3dqLCAtMSk7XHJcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4ai5cclxuICAgICAgICAgIGNvb3JkaW5hdGVzW2pdID0gdmVjdG9yQWRkKHJvd2osIGRpZmZJSiwgLW11bHRpcGxpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgbGVhcm5pbmcgcmF0ZSB7bGFtYmRhfSBieSBhIHByZXNjcmliZWQge2RsYW1iZGF9LlxyXG4gICAgICBsYW1iZGEgLT0gdGhpcy5kbGFtYmRhO1xyXG4gICAgICBpZiAobGFtYmRhIDw9IDAuKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb29yZGluYXRlcztcclxuICB9XHJcbn1cclxuIl19
1
+ import { calculateEuclideanDistance, calcDistanceMatrix, fillRandomMatrix, vectorAdd, randomInt } from './operations';
2
+ /**
3
+ * Implements stochastic proximity embedding.
4
+ *
5
+ * @export
6
+ * @class SPEBase
7
+ * @link doi:10.1016/S1093-3263(03)00155-4
8
+ */
9
+ export class SPEBase {
10
+ /**
11
+ * Creates an instance of SPEBase.
12
+ * @param {Options} [options] Options to pass to the constructor.
13
+ * @memberof SPEBase
14
+ */
15
+ constructor(options) {
16
+ var _a, _b, _c, _d, _e, _f, _g;
17
+ this.steps = (_a = options === null || options === void 0 ? void 0 : options.steps) !== null && _a !== void 0 ? _a : 0;
18
+ this.cycles = (_b = options === null || options === void 0 ? void 0 : options.cycles) !== null && _b !== void 0 ? _b : 1e6;
19
+ // Select a cutoff distance {cutoff} and ...
20
+ this.cutoff = (_c = options === null || options === void 0 ? void 0 : options.cutoff) !== null && _c !== void 0 ? _c : 0;
21
+ // ... an initial learning rate {lambda} > 0
22
+ this.lambda = (_d = options === null || options === void 0 ? void 0 : options.lambda) !== null && _d !== void 0 ? _d : 2.0;
23
+ this.dlambda = (_e = options === null || options === void 0 ? void 0 : options.dlambda) !== null && _e !== void 0 ? _e : 0.01;
24
+ this.lambda2 = this.lambda / 2.;
25
+ this.dlambda2 = this.dlambda / 2.;
26
+ this.epsilon = (_f = options === null || options === void 0 ? void 0 : options.epsilon) !== null && _f !== void 0 ? _f : 1e-10;
27
+ // eslint-disable-next-line brace-style
28
+ this.distanceFunction = (_g = options === null || options === void 0 ? void 0 : options.distance) !== null && _g !== void 0 ? _g : calculateEuclideanDistance;
29
+ this.distance = [];
30
+ }
31
+ /**
32
+ * Initializes distance matrix.
33
+ *
34
+ * @protected
35
+ * @param {Vectors} vectors Input vectors to calculate distance between.
36
+ * @memberof SPEBase
37
+ */
38
+ initDistance(vectors) {
39
+ this.distance = calcDistanceMatrix(vectors, this.distanceFunction);
40
+ }
41
+ /**
42
+ * Calculates distance between the two vectors given.
43
+ *
44
+ * @param {Vectors} vectors Set of vectors to calculate distances between.
45
+ * @param {number} index1 Index of the first vector of the pair.
46
+ * @param {number} index2 Index of the second vector of the pair.
47
+ * @return {number} Distance between these two vectors.
48
+ */
49
+ calcDistance(vectors, index1, index2) {
50
+ return this.distance[index1][index2];
51
+ }
52
+ /**
53
+ * Embeds the vectors given into a two-dimensional space.
54
+ *
55
+ * @param {Vectors} vectors D-dimensional coordinates.
56
+ * @return {Coordinates} SPE coordinates in D space.
57
+ */
58
+ embed(vectors) {
59
+ const nItems = vectors.length;
60
+ const areaWidth = 40;
61
+ // Initialize the D-dimensional coordinates of the N points.
62
+ const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);
63
+ let lambda2 = this.lambda2;
64
+ if (this.steps == 0) {
65
+ this.steps = vectors.length - 1;
66
+ }
67
+ this.initDistance(vectors);
68
+ for (let cycle = 0; cycle < this.cycles; ++cycle) {
69
+ for (let step = 0; step < this.steps; ++step) {
70
+ // Select two points, i and j, at random, ...
71
+ const i = randomInt(nItems);
72
+ let j = randomInt(nItems);
73
+ while (i == j)
74
+ j = randomInt(nItems);
75
+ const rowi = coordinates[i];
76
+ const rowj = coordinates[j];
77
+ // ... retrieve (or evaluate) their proximity in the input space, rij and ...
78
+ const r = this.calcDistance(vectors, i, j);
79
+ // ... compute their Euclidean distance on the D-dimensional map, dij.
80
+ const d = calculateEuclideanDistance(rowi, rowj);
81
+ // If rij <= rc, or if rij > rc and dij < rij ...
82
+ if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {
83
+ const multiplier = lambda2 * (r - d) / (d + this.epsilon);
84
+ // ... update the coordinates xi and xj.
85
+ const diffIJ = vectorAdd(rowi, rowj, -1);
86
+ coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);
87
+ coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);
88
+ }
89
+ }
90
+ // Decrease the learning rate {lambda} by a prescribed {dlambda}.
91
+ lambda2 -= this.dlambda2;
92
+ if (lambda2 <= 0.) {
93
+ break;
94
+ }
95
+ }
96
+ return coordinates;
97
+ }
98
+ }
99
+ SPEBase.dimension = 2;
100
+ /**
101
+ * Implements modified stochastic proximity embedding.
102
+ *
103
+ * @export
104
+ * @class PSPEBase
105
+ * @link doi:10.1016/S1093-3263(03)00155-4
106
+ */
107
+ export class PSPEBase extends SPEBase {
108
+ /**
109
+ * Embeds the vectors given into a two-dimensional space using a modified update rule.
110
+ *
111
+ * @param {Vectors} vectors D-dimensional coordinates.
112
+ * @return {Coordinates} SPE coordinates in D space.
113
+ */
114
+ embed(vectors) {
115
+ const nItems = vectors.length;
116
+ const areaWidth = 40;
117
+ // Initialize the D-dimensional coordinates of the N points.
118
+ const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);
119
+ let lambda = this.lambda;
120
+ this.initDistance(vectors);
121
+ for (let cycle = 0; cycle < this.cycles; ++cycle) {
122
+ // Select a point, i, at random (pivot).
123
+ const i = randomInt(nItems);
124
+ const rowi = coordinates[i];
125
+ // For every point j != i ...
126
+ for (let j = 0; j < nItems; ++j) {
127
+ if (i == j)
128
+ continue;
129
+ const rowj = coordinates[j];
130
+ // ... retrieve (or evaluate) its proximity to i in the input space, rij ...
131
+ const r = this.calcDistance(vectors, i, j);
132
+ // ... and compute their Euclidean distance on the D-dimensional map, dij.
133
+ const d = calculateEuclideanDistance(rowi, rowj);
134
+ // If rij <= rc, or if rij > rc and dij < rij ...
135
+ if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {
136
+ const multiplier = lambda * (r - d) / (d + this.epsilon);
137
+ const diffIJ = vectorAdd(rowi, rowj, -1);
138
+ // ... update the coordinates xj.
139
+ coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);
140
+ }
141
+ }
142
+ // Decrease the learning rate {lambda} by a prescribed {dlambda}.
143
+ lambda -= this.dlambda;
144
+ if (lambda <= 0.) {
145
+ break;
146
+ }
147
+ }
148
+ return coordinates;
149
+ }
150
+ }
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBYWxCOzs7O09BSUc7SUFDSCxZQUFZLE9BQWlCOztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssbUNBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUM7UUFDbkMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLElBQUksQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBQyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLG1DQUFJLEtBQUssQ0FBQztRQUN6Qyx1Q0FBdUM7UUFDdkMsSUFB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QUE0RTtnQkFDNUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQywwRUFBMEU7Z0JBQzFFLE1BQU0sQ0FBQyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2pELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLGlDQUFpQztvQkFDakMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0Y7WUFDRCxpRUFBaUU7WUFDakUsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdkIsSUFBSSxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUNoQixNQUFNO2FBQ1A7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3B0aW9ucywgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7Y2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UsIGNhbGNEaXN0YW5jZU1hdHJpeCwgZmlsbFJhbmRvbU1hdHJpeCwgdmVjdG9yQWRkLCByYW5kb21JbnR9IGZyb20gJy4vb3BlcmF0aW9ucyc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgU1BFQmFzZSB7XG4gIHByb3RlY3RlZCBzdGF0aWMgZGltZW5zaW9uID0gMjtcbiAgcHJvdGVjdGVkIHN0ZXBzOiBudW1iZXI7XG4gIHByb3RlY3RlZCBjeWNsZXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN1dG9mZjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhMjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZXBzaWxvbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGdW5jdGlvbjogRGlzdGFuY2VNZXRyaWM7XG4gIHByb3RlY3RlZCBkaXN0YW5jZTogQ29vcmRpbmF0ZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU1BFQmFzZS5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICogQG1lbWJlcm9mIFNQRUJhc2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDA7XG4gICAgdGhpcy5jeWNsZXMgPSBvcHRpb25zPy5jeWNsZXMgPz8gMWU2O1xuICAgIC8vIFNlbGVjdCBhIGN1dG9mZiBkaXN0YW5jZSB7Y3V0b2ZmfSBhbmQgLi4uXG4gICAgdGhpcy5jdXRvZmYgPSBvcHRpb25zPy5jdXRvZmYgPz8gMDtcbiAgICAvLyAuLi4gYW4gaW5pdGlhbCBsZWFybmluZyByYXRlIHtsYW1iZGF9ID4gMFxuICAgIHRoaXMubGFtYmRhID0gb3B0aW9ucz8ubGFtYmRhID8/IDIuMDtcbiAgICB0aGlzLmRsYW1iZGEgPSBvcHRpb25zPy5kbGFtYmRhID8/IDAuMDE7XG4gICAgdGhpcy5sYW1iZGEyID0gdGhpcy5sYW1iZGEvMi47XG4gICAgdGhpcy5kbGFtYmRhMiA9IHRoaXMuZGxhbWJkYS8yLjtcbiAgICB0aGlzLmVwc2lsb24gPSBvcHRpb25zPy5lcHNpbG9uID8/IDFlLTEwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBicmFjZS1zdHlsZVxuICAgIHRoaXMuZGlzdGFuY2VGdW5jdGlvbiA9IG9wdGlvbnM/LmRpc3RhbmNlID8/IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlO1xuICAgIHRoaXMuZGlzdGFuY2UgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBkaXN0YW5jZSBtYXRyaXguXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4uXG4gICAqIEBtZW1iZXJvZiBTUEVCYXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdERpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMpIHtcbiAgICB0aGlzLmRpc3RhbmNlID0gY2FsY0Rpc3RhbmNlTWF0cml4KHZlY3RvcnMsIHRoaXMuZGlzdGFuY2VGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBnaXZlbi5cbiAgICogXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBTZXQgb2YgdmVjdG9ycyB0byBjYWxjdWxhdGUgZGlzdGFuY2VzIGJldHdlZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDEgSW5kZXggb2YgdGhlIGZpcnN0IHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiBJbmRleCBvZiB0aGUgc2Vjb25kIHZlY3RvciBvZiB0aGUgcGFpci5cbiAgICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGNEaXN0YW5jZSh2ZWN0b3JzOiBWZWN0b3JzLCBpbmRleDE6IG51bWJlciwgaW5kZXgyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlW2luZGV4MV1baW5kZXgyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZS5cbiAgICogXG4gICAqIEBwYXJhbSB7VmVjdG9yc30gdmVjdG9ycyBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzLlxuICAgKiBAcmV0dXJuIHtDb29yZGluYXRlc30gU1BFIGNvb3JkaW5hdGVzIGluIEQgc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IENvb3JkaW5hdGVzIHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBTUEVCYXNlLmRpbWVuc2lvbiwgYXJlYVdpZHRoKTtcblxuICAgIGxldCBsYW1iZGEyID0gdGhpcy5sYW1iZGEyO1xuXG4gICAgaWYgKHRoaXMuc3RlcHMgPT0gMCkge1xuICAgICAgdGhpcy5zdGVwcyA9IHZlY3RvcnMubGVuZ3RoLTE7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0RGlzdGFuY2UodmVjdG9ycyk7XG5cbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcbiAgICAgIGZvciAobGV0IHN0ZXAgPSAwOyBzdGVwIDwgdGhpcy5zdGVwczsgKytzdGVwKSB7XG4gICAgICAgIC8vIFNlbGVjdCB0d28gcG9pbnRzLCBpIGFuZCBqLCBhdCByYW5kb20sIC4uLlxuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7IGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07IGNvbnN0IHJvd2ogPSBjb29yZGluYXRlc1tqXTtcblxuICAgICAgICAvLyAuLi4gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIC4uLiBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cbiAgICAgICAgY29uc3QgZCA9IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHJvd2ksIHJvd2opO1xuXG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEyKihyLWQpLyhkK3RoaXMuZXBzaWxvbik7XG4gICAgICAgICAgLy8gLi4uIHVwZGF0ZSB0aGUgY29vcmRpbmF0ZXMgeGkgYW5kIHhqLlxuICAgICAgICAgIGNvbnN0IGRpZmZJSiA9IHZlY3RvckFkZChyb3dpLCByb3dqLCAtMSk7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbaV0gPSB2ZWN0b3JBZGQocm93aSwgZGlmZklKLCBtdWx0aXBsaWVyKTtcbiAgICAgICAgICBjb29yZGluYXRlc1tqXSA9IHZlY3RvckFkZChyb3dqLCBkaWZmSUosIC1tdWx0aXBsaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRGVjcmVhc2UgdGhlIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gYnkgYSBwcmVzY3JpYmVkIHtkbGFtYmRhfS5cbiAgICAgIGxhbWJkYTIgLT0gdGhpcy5kbGFtYmRhMjtcbiAgICAgIGlmIChsYW1iZGEyIDw9IDAuKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG1vZGlmaWVkIHN0b2NoYXN0aWMgcHJveGltaXR5IGVtYmVkZGluZy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG4gZXhwb3J0IGNsYXNzIFBTUEVCYXNlIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKiBcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMuXG4gICAqIEByZXR1cm4ge0Nvb3JkaW5hdGVzfSBTUEUgY29vcmRpbmF0ZXMgaW4gRCBzcGFjZS5cbiAgICovXG4gIHB1YmxpYyBlbWJlZCh2ZWN0b3JzOiBWZWN0b3JzKTogQ29vcmRpbmF0ZXMge1xuICAgIGNvbnN0IG5JdGVtcyA9IHZlY3RvcnMubGVuZ3RoO1xuICAgIGNvbnN0IGFyZWFXaWR0aCA9IDQwO1xuICAgIC8vICBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBQU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuXG4gICAgdGhpcy5pbml0RGlzdGFuY2UodmVjdG9ycyk7XG5cbiAgICBmb3IgKGxldCBjeWNsZSA9IDA7IGN5Y2xlIDwgdGhpcy5jeWNsZXM7ICsrY3ljbGUpIHtcbiAgICAgIC8vIFNlbGVjdCBhIHBvaW50LCBpLCBhdCByYW5kb20gKHBpdm90KS5cbiAgICAgIGNvbnN0IGk6IG51bWJlciA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuXG4gICAgICAvLyBGb3IgZXZlcnkgcG9pbnQgaiAhPSBpIC4uLlxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgICBpZiAoaSA9PSBqKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgcm93aiA9IGNvb3JkaW5hdGVzW2pdO1xuICAgICAgICAvLyAuLi4gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSBpdHMgcHJveGltaXR5IHRvIGkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogLi4uXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmNhbGNEaXN0YW5jZSh2ZWN0b3JzLCBpLCBqKTtcbiAgICAgICAgLy8gLi4uIGFuZCBjb21wdXRlIHRoZWlyIEV1Y2xpZGVhbiBkaXN0YW5jZSBvbiB0aGUgRC1kaW1lbnNpb25hbCBtYXAsIGRpai5cbiAgICAgICAgY29uc3QgZCA9IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlKHJvd2ksIHJvd2opO1xuICAgICAgICAvLyBJZiByaWogPD0gcmMsIG9yIGlmIHJpaiA+IHJjIGFuZCBkaWogPCByaWogLi4uXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcbiAgICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gbGFtYmRhKihyLWQpLyhkK3RoaXMuZXBzaWxvbik7XG4gICAgICAgICAgY29uc3QgZGlmZklKID0gdmVjdG9yQWRkKHJvd2ksIHJvd2osIC0xKTtcbiAgICAgICAgICAvLyAuLi4gdXBkYXRlIHRoZSBjb29yZGluYXRlcyB4ai5cbiAgICAgICAgICBjb29yZGluYXRlc1tqXSA9IHZlY3RvckFkZChyb3dqLCBkaWZmSUosIC1tdWx0aXBsaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRGVjcmVhc2UgdGhlIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gYnkgYSBwcmVzY3JpYmVkIHtkbGFtYmRhfS5cbiAgICAgIGxhbWJkYSAtPSB0aGlzLmRsYW1iZGE7XG4gICAgICBpZiAobGFtYmRhIDw9IDAuKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { DistanceMetric } from './type-declarations';
2
+ /**
3
+ * Unified class implementing the different string measures.
4
+ *
5
+ * @export
6
+ * @class Measurer
7
+ */
8
+ export declare class Measurer {
9
+ protected method: string;
10
+ static receipt: {
11
+ [name: string]: DistanceMetric;
12
+ };
13
+ /**
14
+ * Creates an instance of Measurer.
15
+ * @param {string} method Method to calculate distance between strings.
16
+ * @memberof Measurer
17
+ */
18
+ constructor(method: string);
19
+ /**
20
+ * Returns custom string distance function specified.
21
+ * @return {DistanceMetric} Callback of the measure chosen.
22
+ */
23
+ getMeasure(): DistanceMetric;
24
+ /**
25
+ * Returns available string distance metrics.
26
+ *
27
+ * @readonly
28
+ * @type {string[]}
29
+ * @memberof Measurer
30
+ */
31
+ static get availableMeasures(): string[];
32
+ }
33
+ //# sourceMappingURL=string-measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-measure.d.ts","sourceRoot":"","sources":["string-measure.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAGnD;;;;;GAKG;AACH,qBAAa,QAAQ;IACjB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,OAAc,OAAO,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAA;KAAC,CAGrD;IAEF;;;;OAIG;gBACS,MAAM,EAAE,MAAM;IAK1B;;;OAGG;IACI,UAAU,IAAI,cAAc;IAInC;;;;;;OAMG;IACH,WAAkB,iBAAiB,IAAK,MAAM,EAAE,CAO/C;CAEJ"}
@@ -1,46 +1,46 @@
1
- import * as fl from 'fastest-levenshtein';
2
- import { jaroWinkler } from 'jaro-winkler-typescript';
3
- import { assert } from './operations';
4
- /**
5
- * Unified class implementing the different string measures.
6
- *
7
- * @export
8
- * @class Measurer
9
- */
10
- export class Measurer {
11
- /**
12
- * Creates an instance of Measurer.
13
- * @param {string} method Method to calculate distance between strings.
14
- * @memberof Measurer
15
- */
16
- constructor(method) {
17
- assert(Measurer.availableMeasures.includes(method), 'The ${method} was not found.');
18
- this.method = method;
19
- }
20
- /**
21
- * Returns custom string distance function specified.
22
- * @return {DistanceMetric} Callback of the measure chosen.
23
- */
24
- getMeasure() {
25
- return Measurer.receipt[this.method];
26
- }
27
- /**
28
- * Returns available string distance metrics.
29
- *
30
- * @readonly
31
- * @type {string[]}
32
- * @memberof Measurer
33
- */
34
- static get availableMeasures() {
35
- let keys = [];
36
- for (let key in Measurer.receipt) {
37
- keys.push(key);
38
- }
39
- return keys;
40
- }
41
- }
42
- Measurer.receipt = {
43
- 'Levenshtein': fl.distance,
44
- 'Jaro-Winkler': jaroWinkler,
45
- };
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLW1lYXN1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdHJpbmctbWVhc3VyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUdwRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPakI7Ozs7T0FJRztJQUNILFlBQVksTUFBYztRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1FBQ25GLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVO1FBQ2YsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxLQUFLLGlCQUFpQjtRQUNqQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFyQ2EsZ0JBQU8sR0FBcUM7SUFDeEQsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRO0lBQzFCLGNBQWMsRUFBRSxXQUFXO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmbCBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcclxuaW1wb3J0IHtqYXJvV2lua2xlcn0gZnJvbSAnamFyby13aW5rbGVyLXR5cGVzY3JpcHQnO1xyXG5cclxuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlX2RlY2xhcmF0aW9ucyc7XHJcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuL29wZXJhdGlvbnMnO1xyXG5cclxuLyoqXHJcbiAqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBkaWZmZXJlbnQgc3RyaW5nIG1lYXN1cmVzLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBNZWFzdXJlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1lYXN1cmVyIHtcclxuICAgIHByb3RlY3RlZCBtZXRob2Q6IHN0cmluZztcclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjZWlwdDoge1tuYW1lOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpY30gPSB7XHJcbiAgICAgICdMZXZlbnNodGVpbic6IGZsLmRpc3RhbmNlLFxyXG4gICAgICAnSmFyby1XaW5rbGVyJzogamFyb1dpbmtsZXIsXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0cmluZ3MuXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWV0aG9kOiBzdHJpbmcpIHtcclxuICAgICAgYXNzZXJ0KE1lYXN1cmVyLmF2YWlsYWJsZU1lYXN1cmVzLmluY2x1ZGVzKG1ldGhvZCksICdUaGUgJHttZXRob2R9IHdhcyBub3QgZm91bmQuJylcclxuICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgZnVuY3Rpb24gc3BlY2lmaWVkLlxyXG4gICAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1lYXN1cmUoKTogRGlzdGFuY2VNZXRyaWMge1xyXG4gICAgICByZXR1cm4gTWVhc3VyZXIucmVjZWlwdFt0aGlzLm1ldGhvZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGF2YWlsYWJsZSBzdHJpbmcgZGlzdGFuY2UgbWV0cmljcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX1cclxuICAgICAqIEBtZW1iZXJvZiBNZWFzdXJlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBhdmFpbGFibGVNZWFzdXJlcygpIDogc3RyaW5nW10ge1xyXG4gICAgICBsZXQga2V5cyA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQga2V5IGluIE1lYXN1cmVyLnJlY2VpcHQpIHtcclxuICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4ga2V5cztcclxuICAgIH1cclxuICAgIFxyXG59XHJcbiJdfQ==
1
+ import * as fl from 'fastest-levenshtein';
2
+ import { jaroWinkler } from 'jaro-winkler-typescript';
3
+ import { assert } from './operations';
4
+ /**
5
+ * Unified class implementing the different string measures.
6
+ *
7
+ * @export
8
+ * @class Measurer
9
+ */
10
+ export class Measurer {
11
+ /**
12
+ * Creates an instance of Measurer.
13
+ * @param {string} method Method to calculate distance between strings.
14
+ * @memberof Measurer
15
+ */
16
+ constructor(method) {
17
+ assert(Measurer.availableMeasures.includes(method), 'The ${method} was not found.');
18
+ this.method = method;
19
+ }
20
+ /**
21
+ * Returns custom string distance function specified.
22
+ * @return {DistanceMetric} Callback of the measure chosen.
23
+ */
24
+ getMeasure() {
25
+ return Measurer.receipt[this.method];
26
+ }
27
+ /**
28
+ * Returns available string distance metrics.
29
+ *
30
+ * @readonly
31
+ * @type {string[]}
32
+ * @memberof Measurer
33
+ */
34
+ static get availableMeasures() {
35
+ let keys = [];
36
+ for (let key in Measurer.receipt) {
37
+ keys.push(key);
38
+ }
39
+ return keys;
40
+ }
41
+ }
42
+ Measurer.receipt = {
43
+ 'Levenshtein': fl.distance,
44
+ 'Jaro-Winkler': jaroWinkler,
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLW1lYXN1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdHJpbmctbWVhc3VyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUdwRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPakI7Ozs7T0FJRztJQUNILFlBQVksTUFBYztRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1FBQ25GLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVO1FBQ2YsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxLQUFLLGlCQUFpQjtRQUNqQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFyQ2EsZ0JBQU8sR0FBcUM7SUFDeEQsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRO0lBQzFCLGNBQWMsRUFBRSxXQUFXO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmbCBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB7amFyb1dpbmtsZXJ9IGZyb20gJ2phcm8td2lua2xlci10eXBlc2NyaXB0JztcblxuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi9vcGVyYXRpb25zJztcblxuLyoqXG4gKiBVbmlmaWVkIGNsYXNzIGltcGxlbWVudGluZyB0aGUgZGlmZmVyZW50IHN0cmluZyBtZWFzdXJlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgTWVhc3VyZXJcbiAqL1xuZXhwb3J0IGNsYXNzIE1lYXN1cmVyIHtcbiAgICBwcm90ZWN0ZWQgbWV0aG9kOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyByZWNlaXB0OiB7W25hbWU6IHN0cmluZ106IERpc3RhbmNlTWV0cmljfSA9IHtcbiAgICAgICdMZXZlbnNodGVpbic6IGZsLmRpc3RhbmNlLFxuICAgICAgJ0phcm8tV2lua2xlcic6IGphcm9XaW5rbGVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIE1lYXN1cmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0cmluZ3MuXG4gICAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgIGFzc2VydChNZWFzdXJlci5hdmFpbGFibGVNZWFzdXJlcy5pbmNsdWRlcyhtZXRob2QpLCAnVGhlICR7bWV0aG9kfSB3YXMgbm90IGZvdW5kLicpXG4gICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgZnVuY3Rpb24gc3BlY2lmaWVkLlxuICAgICAqIEByZXR1cm4ge0Rpc3RhbmNlTWV0cmljfSBDYWxsYmFjayBvZiB0aGUgbWVhc3VyZSBjaG9zZW4uXG4gICAgICovXG4gICAgcHVibGljIGdldE1lYXN1cmUoKTogRGlzdGFuY2VNZXRyaWMge1xuICAgICAgcmV0dXJuIE1lYXN1cmVyLnJlY2VpcHRbdGhpcy5tZXRob2RdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYXZhaWxhYmxlIHN0cmluZyBkaXN0YW5jZSBtZXRyaWNzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgICAqIEBtZW1iZXJvZiBNZWFzdXJlclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1lYXN1cmVzKCkgOiBzdHJpbmdbXSB7XG4gICAgICBsZXQga2V5cyA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBrZXkgaW4gTWVhc3VyZXIucmVjZWlwdCkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzO1xuICAgIH1cbiAgICBcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export declare function tryParseJson(s: string): any;
2
+ //# sourceMappingURL=string-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["string-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAI,GAAG,CAO5C"}
@@ -1,9 +1,9 @@
1
- export function tryParseJson(s) {
2
- try {
3
- return JSON.parse(s);
4
- }
5
- catch (_) {
6
- return null;
7
- }
8
- }
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNsQyxJQUFJO1FBQ0EsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxDQUFDLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQztLQUNmO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiB0cnlQYXJzZUpzb24oczogc3RyaW5nKSA6IGFueSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHMpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKF8pIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufSJdfQ==
1
+ export function tryParseJson(s) {
2
+ try {
3
+ return JSON.parse(s);
4
+ }
5
+ catch (_) {
6
+ return null;
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNsQyxJQUFJO1FBQ0EsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxDQUFDLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQztLQUNmO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiB0cnlQYXJzZUpzb24oczogc3RyaW5nKSA6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uocyk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=table-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-validation.d.ts","sourceRoot":"","sources":["table-validation.ts"],"names":[],"mappings":""}