@datagrok-libraries/utils 0.0.22 → 0.1.2
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 +10 -1
- package/package.json +2 -2
- package/src/array-utils.d.ts +28 -0
- package/src/array-utils.d.ts.map +1 -1
- package/src/array-utils.js +44 -1
- package/src/random.d.ts +17 -0
- package/src/random.d.ts.map +1 -0
- package/src/random.js +21 -0
- package/src/similarity-metrics.d.ts +71 -0
- package/src/similarity-metrics.d.ts.map +1 -1
- package/src/similarity-metrics.js +102 -1
- package/src/test.d.ts +8 -5
- package/src/test.d.ts.map +1 -1
- package/src/test.js +27 -26
- package/src/type-declarations.d.ts +1 -1
- package/src/type-declarations.js +1 -1
- package/src/{operations.d.ts → vector-operations.d.ts} +22 -9
- package/src/vector-operations.d.ts.map +1 -0
- package/src/vector-operations.js +227 -0
- package/src/diverse-subset.d.ts +0 -2
- package/src/diverse-subset.d.ts.map +0 -1
- package/src/diverse-subset.js +0 -32
- package/src/operations.d.ts.map +0 -1
- package/src/operations.js +0 -168
- package/src/test-node.d.ts +0 -11
- package/src/test-node.d.ts.map +0 -1
- package/src/test-node.js +0 -96
package/README.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
# Utils
|
|
2
2
|
|
|
3
|
-
Utils is a Datagrok library with common utilities.
|
|
3
|
+
Utils is a Datagrok library with common utilities.
|
|
4
|
+
|
|
5
|
+
- [array-utils](src/array_utils.ts) facilitates work with conventional arrays.
|
|
6
|
+
- [string-utils](src/string-utils.ts) contains different procedures on strings.
|
|
7
|
+
- [random](src/random.ts) contains different functions for random values generation.
|
|
8
|
+
- [bit-array](src/bit-array.ts) introduces BitArray class aimed to be used in cheminformatics to caclulate molecular fingerprints.
|
|
9
|
+
- [vector-operations](src/vector-operations.ts) contains simple linear algebra functions.
|
|
10
|
+
- [similarity-metrics](src/similarity-metrics.ts) provides different [BitArray](src/bit-array.ts) distance metrics.
|
|
11
|
+
- [test](src/test.ts) implements Datagrok [packages](../../packages) test framework.
|
|
12
|
+
- [test-node](src/test-node.ts) supports remote tests of Datagrok [packages](../../packages).
|
package/package.json
CHANGED
|
@@ -4,13 +4,12 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"fullName": "Utils",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.1.2",
|
|
8
8
|
"description": "Common utilities",
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@types/node": "^14.14.37",
|
|
11
11
|
"datagrok-api": ">=0.117.0",
|
|
12
12
|
"dts-bundle": "^0.7.3",
|
|
13
|
-
"js-yaml": "^4.1.0",
|
|
14
13
|
"node-fetch": "^2.6.0"
|
|
15
14
|
},
|
|
16
15
|
"devDependencies": {
|
|
@@ -20,6 +19,7 @@
|
|
|
20
19
|
"scripts": {
|
|
21
20
|
"link": "npm link",
|
|
22
21
|
"link-api": "npm link datagrok-api",
|
|
22
|
+
"link-all": "npm link datagrok-api",
|
|
23
23
|
"build": "tsc"
|
|
24
24
|
}
|
|
25
25
|
}
|
package/src/array-utils.d.ts
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
export declare namespace ArrayUtils {
|
|
2
|
+
/**
|
|
3
|
+
* Finds indices of element(s) found with the given filter.
|
|
4
|
+
*
|
|
5
|
+
* @export
|
|
6
|
+
* @template T Type of elements in the array.
|
|
7
|
+
* @param {T[]} values Array to search in.
|
|
8
|
+
* @param {(item: T) => boolean} filter Filtering function including an element if it fits a condition.
|
|
9
|
+
* @return {number[]} Idices of elements corresponding the filter.
|
|
10
|
+
*/
|
|
2
11
|
function indexesOf<T>(values: T[], filter: (item: T) => boolean): number[];
|
|
12
|
+
/**
|
|
13
|
+
* Generates array from a range [begin; end] or [begin; end) if endExclusive.
|
|
14
|
+
*
|
|
15
|
+
* @export
|
|
16
|
+
* @param {number} begin Beginning of the range.
|
|
17
|
+
* @param {number} end End of the range.
|
|
18
|
+
* @param {boolean} [endExclusive=false] Whether to exclude the end of the range.
|
|
19
|
+
* @return {Int32Array} The range between begin and end.
|
|
20
|
+
*/
|
|
21
|
+
function genRange(begin: number, end: number, endExclusive?: boolean): Int32Array;
|
|
22
|
+
/**
|
|
23
|
+
* Returns order of values as if they are sorted.
|
|
24
|
+
*
|
|
25
|
+
* @export
|
|
26
|
+
* @param {any[]} values Input array.
|
|
27
|
+
* @param {boolean} [reverse=false] Whether to return reversed order.
|
|
28
|
+
* @return {number[]} The order generated.
|
|
29
|
+
*/
|
|
30
|
+
function argSort(values: any[], reverse?: boolean): number[];
|
|
3
31
|
}
|
|
4
32
|
//# sourceMappingURL=array-utils.d.ts.map
|
package/src/array-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils.d.ts","sourceRoot":"","sources":["array-utils.ts"],"names":[],"mappings":"AAAA,yBAAiB,UAAU,CAAC;IAE1B,SAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,EAAE,CAMhF;CACF"}
|
|
1
|
+
{"version":3,"file":"array-utils.d.ts","sourceRoot":"","sources":["array-utils.ts"],"names":[],"mappings":"AAAA,yBAAiB,UAAU,CAAC;IAE1B;;;;;;;;OAQG;IACH,SAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,EAAE,CAMhF;IAED;;;;;;;;OAQG;IACH,SAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,UAAU,CAOrF;IAED;;;;;;;OAOG;IACH,SAAgB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,MAAM,EAAE,CAMzE;CACF"}
|
package/src/array-utils.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export var ArrayUtils;
|
|
2
2
|
(function (ArrayUtils) {
|
|
3
|
+
/**
|
|
4
|
+
* Finds indices of element(s) found with the given filter.
|
|
5
|
+
*
|
|
6
|
+
* @export
|
|
7
|
+
* @template T Type of elements in the array.
|
|
8
|
+
* @param {T[]} values Array to search in.
|
|
9
|
+
* @param {(item: T) => boolean} filter Filtering function including an element if it fits a condition.
|
|
10
|
+
* @return {number[]} Idices of elements corresponding the filter.
|
|
11
|
+
*/
|
|
3
12
|
function indexesOf(values, filter) {
|
|
4
13
|
const indexes = [];
|
|
5
14
|
for (let i = 0; i < values.length; i++)
|
|
@@ -8,5 +17,39 @@ export var ArrayUtils;
|
|
|
8
17
|
return indexes;
|
|
9
18
|
}
|
|
10
19
|
ArrayUtils.indexesOf = indexesOf;
|
|
20
|
+
/**
|
|
21
|
+
* Generates array from a range [begin; end] or [begin; end) if endExclusive.
|
|
22
|
+
*
|
|
23
|
+
* @export
|
|
24
|
+
* @param {number} begin Beginning of the range.
|
|
25
|
+
* @param {number} end End of the range.
|
|
26
|
+
* @param {boolean} [endExclusive=false] Whether to exclude the end of the range.
|
|
27
|
+
* @return {Int32Array} The range between begin and end.
|
|
28
|
+
*/
|
|
29
|
+
function genRange(begin, end, endExclusive = false) {
|
|
30
|
+
const nItems = end - begin + (endExclusive ? 0 : 1);
|
|
31
|
+
const series = new Int32Array(nItems);
|
|
32
|
+
for (let i = 0; i < nItems; ++i) {
|
|
33
|
+
series[i] = begin + i;
|
|
34
|
+
}
|
|
35
|
+
return series;
|
|
36
|
+
}
|
|
37
|
+
ArrayUtils.genRange = genRange;
|
|
38
|
+
/**
|
|
39
|
+
* Returns order of values as if they are sorted.
|
|
40
|
+
*
|
|
41
|
+
* @export
|
|
42
|
+
* @param {any[]} values Input array.
|
|
43
|
+
* @param {boolean} [reverse=false] Whether to return reversed order.
|
|
44
|
+
* @return {number[]} The order generated.
|
|
45
|
+
*/
|
|
46
|
+
function argSort(values, reverse = false) {
|
|
47
|
+
const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);
|
|
48
|
+
const decor = (v, i) => [v, i]; // set index to value
|
|
49
|
+
const undecor = (a) => a[1]; // leave only index
|
|
50
|
+
const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);
|
|
51
|
+
return _argsort(values);
|
|
52
|
+
}
|
|
53
|
+
ArrayUtils.argSort = argSort;
|
|
11
54
|
})(ArrayUtils || (ArrayUtils = {}));
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcnJheS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLEtBQVcsVUFBVSxDQW9EMUI7QUFwREQsV0FBaUIsVUFBVTtJQUV6Qjs7Ozs7Ozs7T0FRRztJQUNILFNBQWdCLFNBQVMsQ0FBSSxNQUFXLEVBQUUsTUFBNEI7UUFDcEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQU5lLG9CQUFTLFlBTXhCLENBQUE7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFNBQWdCLFFBQVEsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQ3ZFLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFQZSxtQkFBUSxXQU92QixDQUFBO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFNBQWdCLE9BQU8sQ0FBQyxNQUFhLEVBQUUsVUFBbUIsS0FBSztRQUM3RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkcsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUNsRSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQU5lLGtCQUFPLFVBTXRCLENBQUE7QUFDSCxDQUFDLEVBcERnQixVQUFVLEtBQVYsVUFBVSxRQW9EMUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbmFtZXNwYWNlIEFycmF5VXRpbHMge1xuXG4gIC8qKlxuICAgKiBGaW5kcyBpbmRpY2VzIG9mIGVsZW1lbnQocykgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gZmlsdGVyLlxuICAgKlxuICAgKiBAZXhwb3J0XG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0ge1RbXX0gdmFsdWVzIEFycmF5IHRvIHNlYXJjaCBpbi5cbiAgICogQHBhcmFtIHsoaXRlbTogVCkgPT4gYm9vbGVhbn0gZmlsdGVyIEZpbHRlcmluZyBmdW5jdGlvbiBpbmNsdWRpbmcgYW4gZWxlbWVudCBpZiBpdCBmaXRzIGEgY29uZGl0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJbXX0gSWRpY2VzIG9mIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdGhlIGZpbHRlci5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmRleGVzT2Y8VD4odmFsdWVzOiBUW10sIGZpbHRlcjogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBudW1iZXJbXSB7XG4gICAgY29uc3QgaW5kZXhlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKGZpbHRlcih2YWx1ZXNbaV0pKVxuICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgcmV0dXJuIGluZGV4ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFycmF5IGZyb20gYSByYW5nZSBbYmVnaW47IGVuZF0gb3IgW2JlZ2luOyBlbmQpIGlmIGVuZEV4Y2x1c2l2ZS5cbiAgICpcbiAgICogQGV4cG9ydFxuICAgKiBAcGFyYW0ge251bWJlcn0gYmVnaW4gQmVnaW5uaW5nIG9mIHRoZSByYW5nZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBFbmQgb2YgdGhlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtlbmRFeGNsdXNpdmU9ZmFsc2VdIFdoZXRoZXIgdG8gZXhjbHVkZSB0aGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICogQHJldHVybiB7SW50MzJBcnJheX0gVGhlIHJhbmdlIGJldHdlZW4gYmVnaW4gYW5kIGVuZC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gICAgY29uc3Qgc2VyaWVzID0gbmV3IEludDMyQXJyYXkobkl0ZW1zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG4gICAgfVxuICAgIHJldHVybiBzZXJpZXM7XG4gIH1cbiAgXG4gIC8qKiAgXG4gICAqIFJldHVybnMgb3JkZXIgb2YgdmFsdWVzIGFzIGlmIHRoZXkgYXJlIHNvcnRlZC5cbiAgICpcbiAgICogQGV4cG9ydFxuICAgKiBAcGFyYW0ge2FueVtdfSB2YWx1ZXMgSW5wdXQgYXJyYXkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICAgKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGdlbmVyYXRlZC5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBhcmdTb3J0KHZhbHVlczogYW55W10sIHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gICAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gICAgY29uc3QgdW5kZWNvciA9IChhOiBhbnlbXSkgPT4gYVsxXTsgLy8gbGVhdmUgb25seSBpbmRleFxuICAgIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gICAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG4gIH1cbn0iXX0=
|
package/src/random.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates single random float from 0 to range.
|
|
3
|
+
*
|
|
4
|
+
* @export
|
|
5
|
+
* @param {number} range Max generating value.
|
|
6
|
+
* @return {number} A random float generated.
|
|
7
|
+
*/
|
|
8
|
+
export declare function randomFloat(range: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* Generates single random integer from 0 to range.
|
|
11
|
+
*
|
|
12
|
+
* @export
|
|
13
|
+
* @param {number} range Max generating value.
|
|
14
|
+
* @return {number} A random integer generated.
|
|
15
|
+
*/
|
|
16
|
+
export declare function randomInt(range: number): number;
|
|
17
|
+
//# sourceMappingURL=random.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["random.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAEF;;;;;;GAMG;AACF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
package/src/random.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates single random float from 0 to range.
|
|
3
|
+
*
|
|
4
|
+
* @export
|
|
5
|
+
* @param {number} range Max generating value.
|
|
6
|
+
* @return {number} A random float generated.
|
|
7
|
+
*/
|
|
8
|
+
export function randomFloat(range) {
|
|
9
|
+
return Math.random() * range;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Generates single random integer from 0 to range.
|
|
13
|
+
*
|
|
14
|
+
* @export
|
|
15
|
+
* @param {number} range Max generating value.
|
|
16
|
+
* @return {number} A random integer generated.
|
|
17
|
+
*/
|
|
18
|
+
export function randomInt(range) {
|
|
19
|
+
return Math.floor(randomFloat(range));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNGLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN0QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDaEMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNGLE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUZsb2F0KHJhbmdlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG4gfVxuICBcbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuIGV4cG9ydCBmdW5jdGlvbiByYW5kb21JbnQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbiB9XG4iXX0=
|
|
@@ -2,14 +2,85 @@ import BitArray from './bit-array';
|
|
|
2
2
|
export declare const similarityMetric: {
|
|
3
3
|
[name: string]: (x: BitArray, y: BitArray) => number;
|
|
4
4
|
};
|
|
5
|
+
/**
|
|
6
|
+
* Returns Tanimoto similarity between two BitArray's
|
|
7
|
+
*
|
|
8
|
+
* @param {BitArray} x
|
|
9
|
+
* @param {BitArray} y
|
|
10
|
+
* @returns tanimoto similarity
|
|
11
|
+
*/
|
|
5
12
|
export declare function tanimotoSimilarity(x: BitArray, y: BitArray): number;
|
|
13
|
+
/**
|
|
14
|
+
* Returns Dice similarity between two BitArray's
|
|
15
|
+
*
|
|
16
|
+
* @param {BitArray} x
|
|
17
|
+
* @param {BitArray} y
|
|
18
|
+
* @returns dice similarity
|
|
19
|
+
*/
|
|
6
20
|
export declare function diceSimilarity(x: BitArray, y: BitArray): number;
|
|
21
|
+
/**
|
|
22
|
+
* Returns Cosine similarity between two BitArray's
|
|
23
|
+
*
|
|
24
|
+
* @param {BitArray} x
|
|
25
|
+
* @param {BitArray} y
|
|
26
|
+
* @returns cosine similarity
|
|
27
|
+
*/
|
|
7
28
|
export declare function cosineSimilarity(x: BitArray, y: BitArray): number;
|
|
29
|
+
/**
|
|
30
|
+
* Returns Sokal similarity between two BitArray's
|
|
31
|
+
*
|
|
32
|
+
* @param {BitArray} x
|
|
33
|
+
* @param {BitArray} y
|
|
34
|
+
* @returns sokal similarity
|
|
35
|
+
*/
|
|
8
36
|
export declare function sokalSimilarity(x: BitArray, y: BitArray): number;
|
|
37
|
+
/**
|
|
38
|
+
* Returns Kulczynski similarity between two BitArray's
|
|
39
|
+
*
|
|
40
|
+
* @param {BitArray} x
|
|
41
|
+
* @param {BitArray} y
|
|
42
|
+
* @returns kulczynski similarity
|
|
43
|
+
*/
|
|
9
44
|
export declare function kulczynskiSimilarity(x: BitArray, y: BitArray): number;
|
|
45
|
+
/**
|
|
46
|
+
* Returns McConnaughey similarity between two BitArray's
|
|
47
|
+
*
|
|
48
|
+
* @param {BitArray} x
|
|
49
|
+
* @param {BitArray} y
|
|
50
|
+
* @returns mcConnaughey similarity
|
|
51
|
+
*/
|
|
10
52
|
export declare function mcConnaugheySimilarity(x: BitArray, y: BitArray): number;
|
|
53
|
+
/**
|
|
54
|
+
* Returns Asymmetric similarity between two BitArray's
|
|
55
|
+
*
|
|
56
|
+
* @param {BitArray} x
|
|
57
|
+
* @param {BitArray} y
|
|
58
|
+
* @returns asymmetric similarity
|
|
59
|
+
*/
|
|
11
60
|
export declare function asymmetricSimilarity(x: BitArray, y: BitArray): number;
|
|
61
|
+
/**
|
|
62
|
+
* Returns Braun-Blanquet similarity between two BitArray's
|
|
63
|
+
*
|
|
64
|
+
* @param {BitArray} x
|
|
65
|
+
* @param {BitArray} y
|
|
66
|
+
* @returns braunBlanquet similarity
|
|
67
|
+
*/
|
|
12
68
|
export declare function braunBlanquetSimilarity(x: BitArray, y: BitArray): number;
|
|
69
|
+
/**
|
|
70
|
+
* Returns Russel similarity between two BitArray's
|
|
71
|
+
*
|
|
72
|
+
* @param {BitArray} x
|
|
73
|
+
* @param {BitArray} y
|
|
74
|
+
* @returns russel similarity
|
|
75
|
+
*/
|
|
13
76
|
export declare function russelSimilarity(x: BitArray, y: BitArray): number;
|
|
77
|
+
/**
|
|
78
|
+
* Returns Rogot-Goldberg similarity between two BitArray's
|
|
79
|
+
*
|
|
80
|
+
* @param {BitArray} x
|
|
81
|
+
* @param {BitArray} y
|
|
82
|
+
* @returns rogotGoldberg similarity
|
|
83
|
+
*/
|
|
14
84
|
export declare function rogotGoldbergSimilarity(x: BitArray, y: BitArray): number;
|
|
85
|
+
export declare function getDiverseSubset(length: number, n: number, dist: (i1: number, i2: number) => number): number[];
|
|
15
86
|
//# sourceMappingURL=similarity-metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"similarity-metrics.d.ts","sourceRoot":"","sources":["similarity-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"similarity-metrics.d.ts","sourceRoot":"","sources":["similarity-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAA;AAGlC,eAAO,MAAM,gBAAgB,EAAE;IAAC,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,KAAK,MAAM,CAAA;CAWnF,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAMnE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAM/D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAMjE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOrE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOvE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAMrE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAMxE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAKjE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,YAoCnG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomInt } from "./random";
|
|
1
2
|
export const similarityMetric = {
|
|
2
3
|
'Tanimoto': tanimotoSimilarity,
|
|
3
4
|
'Dice': diceSimilarity,
|
|
@@ -10,6 +11,13 @@ export const similarityMetric = {
|
|
|
10
11
|
'Russel': russelSimilarity,
|
|
11
12
|
'Sokal': sokalSimilarity,
|
|
12
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Returns Tanimoto similarity between two BitArray's
|
|
16
|
+
*
|
|
17
|
+
* @param {BitArray} x
|
|
18
|
+
* @param {BitArray} y
|
|
19
|
+
* @returns tanimoto similarity
|
|
20
|
+
*/
|
|
13
21
|
export function tanimotoSimilarity(x, y) {
|
|
14
22
|
const total = x.trueCount() + y.trueCount();
|
|
15
23
|
if (total == 0)
|
|
@@ -17,6 +25,13 @@ export function tanimotoSimilarity(x, y) {
|
|
|
17
25
|
const common = x.andWithCountBits(y, true);
|
|
18
26
|
return common / (total - common);
|
|
19
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns Dice similarity between two BitArray's
|
|
30
|
+
*
|
|
31
|
+
* @param {BitArray} x
|
|
32
|
+
* @param {BitArray} y
|
|
33
|
+
* @returns dice similarity
|
|
34
|
+
*/
|
|
20
35
|
export function diceSimilarity(x, y) {
|
|
21
36
|
const total = x.trueCount() + y.trueCount();
|
|
22
37
|
if (total == 0)
|
|
@@ -24,6 +39,13 @@ export function diceSimilarity(x, y) {
|
|
|
24
39
|
const common = x.andWithCountBits(y, true);
|
|
25
40
|
return 2 * common / total;
|
|
26
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Returns Cosine similarity between two BitArray's
|
|
44
|
+
*
|
|
45
|
+
* @param {BitArray} x
|
|
46
|
+
* @param {BitArray} y
|
|
47
|
+
* @returns cosine similarity
|
|
48
|
+
*/
|
|
27
49
|
export function cosineSimilarity(x, y) {
|
|
28
50
|
const total = x.trueCount() * y.trueCount();
|
|
29
51
|
if (total == 0)
|
|
@@ -31,11 +53,25 @@ export function cosineSimilarity(x, y) {
|
|
|
31
53
|
const common = x.andWithCountBits(y, true);
|
|
32
54
|
return common / Math.sqrt(total);
|
|
33
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns Sokal similarity between two BitArray's
|
|
58
|
+
*
|
|
59
|
+
* @param {BitArray} x
|
|
60
|
+
* @param {BitArray} y
|
|
61
|
+
* @returns sokal similarity
|
|
62
|
+
*/
|
|
34
63
|
export function sokalSimilarity(x, y) {
|
|
35
64
|
const total = x.trueCount() + y.trueCount();
|
|
36
65
|
const common = x.andWithCountBits(y, true);
|
|
37
66
|
return common / (2 * total - 3 * common);
|
|
38
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns Kulczynski similarity between two BitArray's
|
|
70
|
+
*
|
|
71
|
+
* @param {BitArray} x
|
|
72
|
+
* @param {BitArray} y
|
|
73
|
+
* @returns kulczynski similarity
|
|
74
|
+
*/
|
|
39
75
|
export function kulczynskiSimilarity(x, y) {
|
|
40
76
|
const total = x.trueCount() + y.trueCount();
|
|
41
77
|
const totalProd = x.trueCount() * y.trueCount();
|
|
@@ -44,6 +80,13 @@ export function kulczynskiSimilarity(x, y) {
|
|
|
44
80
|
const common = x.andWithCountBits(y, true);
|
|
45
81
|
return (common * total) / (2 * totalProd);
|
|
46
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Returns McConnaughey similarity between two BitArray's
|
|
85
|
+
*
|
|
86
|
+
* @param {BitArray} x
|
|
87
|
+
* @param {BitArray} y
|
|
88
|
+
* @returns mcConnaughey similarity
|
|
89
|
+
*/
|
|
47
90
|
export function mcConnaugheySimilarity(x, y) {
|
|
48
91
|
const total = x.trueCount() + y.trueCount();
|
|
49
92
|
const totalProd = x.trueCount() * y.trueCount();
|
|
@@ -52,6 +95,13 @@ export function mcConnaugheySimilarity(x, y) {
|
|
|
52
95
|
const common = x.andWithCountBits(y, true);
|
|
53
96
|
return (common * total - totalProd) / totalProd;
|
|
54
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Returns Asymmetric similarity between two BitArray's
|
|
100
|
+
*
|
|
101
|
+
* @param {BitArray} x
|
|
102
|
+
* @param {BitArray} y
|
|
103
|
+
* @returns asymmetric similarity
|
|
104
|
+
*/
|
|
55
105
|
export function asymmetricSimilarity(x, y) {
|
|
56
106
|
const min = Math.min(x.trueCount(), y.trueCount());
|
|
57
107
|
if (min == 0)
|
|
@@ -59,6 +109,13 @@ export function asymmetricSimilarity(x, y) {
|
|
|
59
109
|
const common = x.andWithCountBits(y, true);
|
|
60
110
|
return common / min;
|
|
61
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns Braun-Blanquet similarity between two BitArray's
|
|
114
|
+
*
|
|
115
|
+
* @param {BitArray} x
|
|
116
|
+
* @param {BitArray} y
|
|
117
|
+
* @returns braunBlanquet similarity
|
|
118
|
+
*/
|
|
62
119
|
export function braunBlanquetSimilarity(x, y) {
|
|
63
120
|
const max = Math.max(x.trueCount(), y.trueCount());
|
|
64
121
|
if (max == 0)
|
|
@@ -66,12 +123,26 @@ export function braunBlanquetSimilarity(x, y) {
|
|
|
66
123
|
const common = x.andWithCountBits(y, true);
|
|
67
124
|
return common / max;
|
|
68
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Returns Russel similarity between two BitArray's
|
|
128
|
+
*
|
|
129
|
+
* @param {BitArray} x
|
|
130
|
+
* @param {BitArray} y
|
|
131
|
+
* @returns russel similarity
|
|
132
|
+
*/
|
|
69
133
|
export function russelSimilarity(x, y) {
|
|
70
134
|
if (x.length == 0)
|
|
71
135
|
return 0.0;
|
|
72
136
|
const common = x.andWithCountBits(y, true);
|
|
73
137
|
return common / x.length;
|
|
74
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Returns Rogot-Goldberg similarity between two BitArray's
|
|
141
|
+
*
|
|
142
|
+
* @param {BitArray} x
|
|
143
|
+
* @param {BitArray} y
|
|
144
|
+
* @returns rogotGoldberg similarity
|
|
145
|
+
*/
|
|
75
146
|
export function rogotGoldbergSimilarity(x, y) {
|
|
76
147
|
let common = x.andWithCountBits(y, true);
|
|
77
148
|
let total = x.countBits(true) + y.countBits(true);
|
|
@@ -82,4 +153,34 @@ export function rogotGoldbergSimilarity(x, y) {
|
|
|
82
153
|
else
|
|
83
154
|
return common / total + diff / (2 * len - total);
|
|
84
155
|
}
|
|
85
|
-
|
|
156
|
+
export function getDiverseSubset(length, n, dist) {
|
|
157
|
+
function maxBy(values, orderBy) {
|
|
158
|
+
let maxValue = null;
|
|
159
|
+
let maxOrderBy = null;
|
|
160
|
+
for (const element of values) {
|
|
161
|
+
let elementOrderBy = orderBy(element);
|
|
162
|
+
if (maxOrderBy == null || elementOrderBy > maxOrderBy) {
|
|
163
|
+
maxValue = element;
|
|
164
|
+
maxOrderBy = elementOrderBy;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return maxValue;
|
|
168
|
+
}
|
|
169
|
+
let subset = [randomInt(length - 1)];
|
|
170
|
+
let complement = new Set();
|
|
171
|
+
for (let i = 0; i < length; ++i) {
|
|
172
|
+
if (!subset.includes(i))
|
|
173
|
+
complement.add(i);
|
|
174
|
+
}
|
|
175
|
+
while (subset.length < n) {
|
|
176
|
+
let idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {
|
|
177
|
+
return dist(i, val);
|
|
178
|
+
})));
|
|
179
|
+
if (idx) {
|
|
180
|
+
subset.push(idx);
|
|
181
|
+
complement.delete(idx);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return subset;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltaWxhcml0eS1tZXRyaWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2ltaWxhcml0eS1tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQTJEO0lBQ3RGLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUIsTUFBTSxFQUFFLGNBQWM7SUFDdEIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxnQkFBZ0IsRUFBRSx1QkFBdUI7SUFDekMsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixZQUFZLEVBQUUsb0JBQW9CO0lBQ2xDLGVBQWUsRUFBRSxzQkFBc0I7SUFDdkMsZ0JBQWdCLEVBQUUsdUJBQXVCO0lBQ3pDLFFBQVEsRUFBRSxnQkFBZ0I7SUFDMUIsT0FBTyxFQUFFLGVBQWU7Q0FDekIsQ0FBQTtBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUN6RCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVDLElBQUksS0FBSyxJQUFJLENBQUM7UUFDWixPQUFPLEdBQUcsQ0FBQztJQUNiLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDckQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1QyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQ1osT0FBTyxH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QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsRUFBRSxLQUFLO1lBQ3pELE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN4QjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRBcnJheSBmcm9tICcuL2JpdC1hcnJheSdcbmltcG9ydCB7cmFuZG9tSW50fSBmcm9tIFwiLi9yYW5kb21cIjtcblxuZXhwb3J0IGNvbnN0IHNpbWlsYXJpdHlNZXRyaWM6IHtbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyfSA9IHtcbiAgJ1Rhbmltb3RvJzogdGFuaW1vdG9TaW1pbGFyaXR5LFxuICAnRGljZSc6IGRpY2VTaW1pbGFyaXR5LFxuICAnQXN5bW1ldHJpYyc6IGFzeW1tZXRyaWNTaW1pbGFyaXR5LFxuICAnQnJhdW4tQmxhbnF1ZXQnOiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSxcbiAgJ0Nvc2luZSc6IGNvc2luZVNpbWlsYXJpdHksXG4gICdLdWxjenluc2tpJzoga3VsY3p5bnNraVNpbWlsYXJpdHksXG4gICdNYy1Db25uYXVnaGV5JzogbWNDb25uYXVnaGV5U2ltaWxhcml0eSxcbiAgJ1JvZ290LUdvbGRiZXJnJzogcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHksXG4gICdSdXNzZWwnOiBydXNzZWxTaW1pbGFyaXR5LFxuICAnU29rYWwnOiBzb2thbFNpbWlsYXJpdHksXG59XG5cbi8qKlxuICogUmV0dXJucyBUYW5pbW90byBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIEJpdEFycmF5J3NcbiAqIFxuICogQHBhcmFtIHtCaXRBcnJheX0geCBcbiAqIEBwYXJhbSB7Qml0QXJyYXl9IHkgXG4gKiBAcmV0dXJucyB0YW5pbW90byBzaW1pbGFyaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApXG4gICAgcmV0dXJuIDEuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKHRvdGFsIC0gY29tbW9uKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIERpY2Ugc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBCaXRBcnJheSdzXG4gKiBcbiAqIEBwYXJhbSB7Qml0QXJyYXl9IHggXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB5IFxuICogQHJldHVybnMgZGljZSBzaW1pbGFyaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWNlU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMClcbiAgICByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAyICogY29tbW9uIC8gdG90YWw7XG59XG5cbi8qKlxuICogUmV0dXJucyBDb3NpbmUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBCaXRBcnJheSdzXG4gKiBcbiAqIEBwYXJhbSB7Qml0QXJyYXl9IHggXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB5IFxuICogQHJldHVybnMgY29zaW5lIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApXG4gICAgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gTWF0aC5zcXJ0KHRvdGFsKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIFNva2FsIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gQml0QXJyYXknc1xuICogXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB4IFxuICogQHBhcmFtIHtCaXRBcnJheX0geSBcbiAqIEByZXR1cm5zIHNva2FsIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNva2FsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAoMiAqIHRvdGFsIC0gMyAqIGNvbW1vbik7XG59XG5cbi8qKlxuICogUmV0dXJucyBLdWxjenluc2tpIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gQml0QXJyYXknc1xuICogXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB4IFxuICogQHBhcmFtIHtCaXRBcnJheX0geSBcbiAqIEByZXR1cm5zIGt1bGN6eW5za2kgc2ltaWxhcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMClcbiAgICByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwpIC8gKDIgKiB0b3RhbFByb2QpO1xufVxuXG4vKipcbiAqIFJldHVybnMgTWNDb25uYXVnaGV5IHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gQml0QXJyYXknc1xuICogXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB4IFxuICogQHBhcmFtIHtCaXRBcnJheX0geSBcbiAqIEByZXR1cm5zIG1jQ29ubmF1Z2hleSBzaW1pbGFyaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IHRvdGFsUHJvZCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWxQcm9kID09IDApXG4gICAgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsIC0gdG90YWxQcm9kKSAvIHRvdGFsUHJvZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEFzeW1tZXRyaWMgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBCaXRBcnJheSdzXG4gKiBcbiAqIEBwYXJhbSB7Qml0QXJyYXl9IHggXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB5IFxuICogQHJldHVybnMgYXN5bW1ldHJpYyBzaW1pbGFyaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3ltbWV0cmljU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbih4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1pbiA9PSAwKVxuICAgIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1pbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEJyYXVuLUJsYW5xdWV0IHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gQml0QXJyYXknc1xuICogXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB4IFxuICogQHBhcmFtIHtCaXRBcnJheX0geSBcbiAqIEByZXR1cm5zIGJyYXVuQmxhbnF1ZXQgc2ltaWxhcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtYXggPT0gMClcbiAgICByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtYXg7XG59XG5cbi8qKlxuICogUmV0dXJucyBSdXNzZWwgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBCaXRBcnJheSdzXG4gKiBcbiAqIEBwYXJhbSB7Qml0QXJyYXl9IHggXG4gKiBAcGFyYW0ge0JpdEFycmF5fSB5IFxuICogQHJldHVybnMgcnVzc2VsIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKHgubGVuZ3RoID09IDApXG4gICAgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8geC5sZW5ndGg7XG59XG5cbi8qKlxuICogUmV0dXJucyBSb2dvdC1Hb2xkYmVyZyBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIEJpdEFycmF5J3NcbiAqIFxuICogQHBhcmFtIHtCaXRBcnJheX0geCBcbiAqIEBwYXJhbSB7Qml0QXJyYXl9IHkgXG4gKiBAcmV0dXJucyByb2dvdEdvbGRiZXJnIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGxldCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIGxldCB0b3RhbCA9IHguY291bnRCaXRzKHRydWUpICsgeS5jb3VudEJpdHModHJ1ZSk7XG4gIGxldCBsZW4gPSB4Lmxlbmd0aDtcbiAgbGV0IGRpZmYgPSBsZW4gLSB0b3RhbCArIGNvbW1vbjtcbiAgaWYgKChjb21tb24gPT0gbGVuKSB8fCAoZGlmZiA9PSBsZW4pKSByZXR1cm4gMS4wO1xuICBlbHNlIHJldHVybiBjb21tb24gLyB0b3RhbCArIGRpZmYgLyAoMiAqIGxlbiAtIHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcikge1xuXG4gIGZ1bmN0aW9uIG1heEJ5KHZhbHVlczogSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LCBvcmRlckJ5OiAoaTogbnVtYmVyKSA9PiBudW1iZXIpIHtcbiAgICBsZXQgbWF4VmFsdWUgPSBudWxsO1xuICAgIGxldCBtYXhPcmRlckJ5ID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB2YWx1ZXMpIHtcbiAgICAgIGxldCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlOyAgXG4gIH1cblxuICBsZXQgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGxldCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgbGV0IGlkeCA9IG1heEJ5KFxuICAgICAgY29tcGxlbWVudC52YWx1ZXMoKSBhcyBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sXG4gICAgICAoaSkgPT4gTWF0aC5taW4uYXBwbHkoTWF0aCwgc3Vic2V0Lm1hcChmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpOyBcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG4iXX0=
|
package/src/test.d.ts
CHANGED
|
@@ -11,17 +11,20 @@ export declare let currentCategory: string;
|
|
|
11
11
|
export declare namespace assure {
|
|
12
12
|
function notNull(value: any, name?: string): void;
|
|
13
13
|
}
|
|
14
|
+
export interface TestOptions {
|
|
15
|
+
timeout?: number;
|
|
16
|
+
unhandledExceptionTimeout?: number;
|
|
17
|
+
}
|
|
14
18
|
export declare class Test {
|
|
15
19
|
test: () => Promise<any>;
|
|
16
20
|
name: string;
|
|
17
21
|
category: string;
|
|
18
|
-
|
|
22
|
+
options?: TestOptions;
|
|
23
|
+
constructor(category: string, name: string, test: () => Promise<any>, options?: TestOptions);
|
|
19
24
|
}
|
|
20
|
-
export declare function test(name: string, test: () => Promise<any
|
|
25
|
+
export declare function test(name: string, test: () => Promise<any>, options?: TestOptions): void;
|
|
21
26
|
/** Awaits for a while checking the error status of the platform */
|
|
22
|
-
export declare function
|
|
23
|
-
/** Does best effort to catch all exceptional situations. Currently doesn't catch "Uncaught in promise" */
|
|
24
|
-
export declare function testExpectFinish(name: string, foo: () => Promise<any>, ms?: number): Promise<void>;
|
|
27
|
+
export declare function assertNoError(ms: number): Promise<boolean>;
|
|
25
28
|
/** Tests two objects for equality, throws an exception if they are not equal. */
|
|
26
29
|
export declare function expect(actual: any, expected: any): void;
|
|
27
30
|
export declare function expectFloat(actual: number, expected: number, tolerance?: number): void;
|
package/src/test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"AAEA,eAAO,IAAI,KAAK,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG;QAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAC,CAAA;CAAM,CAAC;AAEjK,eAAO,IAAI,eAAe,EAAE,MAAM,CAAC;AAEnC,yBAAiB,MAAM,CAAC;IAEtB,SAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,QAGhD;CACF;AAED,qBAAa,IAAI;IACf,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"AAEA,eAAO,IAAI,KAAK,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG;QAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAC,CAAA;CAAM,CAAC;AAEjK,eAAO,IAAI,eAAe,EAAE,MAAM,CAAC;AAEnC,yBAAiB,MAAM,CAAC;IAEtB,SAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,QAGhD;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAG,MAAM,CAAC;IAClB,yBAAyB,CAAC,EAAG,MAAM,CAAC;CACrC;AAED,qBAAa,IAAI;IACf,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,WAAW,CAAC;gBAEV,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW;CAsB5F;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAMxF;AAED,mEAAmE;AACnE,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED,iFAAiF;AACjF,wBAAgB,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CAGvD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,IAAI,CAIrF;AAED,4BAA4B;AAC5B,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAGlE;AAED,wFAAwF;AACxF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAIxD;AAED,uFAAuF;AACvF,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAItD;AAGD,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC;;;aACf,OAAO;YAAU,MAAM;KAkClF;AAiBD,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,iBAErC"}
|