UNPKG

2.17 kBJavaScriptView Raw
1'use strict';
2
3var flatten = require('../../utils/array').flatten;
4
5function factory(type, config, load, typed) {
6 var MatrixIndex = load(require('../../type/matrix/MatrixIndex'));
7 var size = load(require('../matrix/size'));
8 var subset = load(require('../matrix/subset'));
9 var compareNatural = load(require('../relational/compareNatural'));
10
11 /**
12 * Create the powerset of a (multi)set. (The powerset contains very possible subsets of a (multi)set.)
13 * A multi-dimension array will be converted to a single-dimension array before the operation.
14 *
15 * Syntax:
16 *
17 * math.setPowerset(set)
18 *
19 * Examples:
20 *
21 * math.setPowerset([1, 2, 3]) // returns [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
22 *
23 * See also:
24 *
25 * setCartesian
26 *
27 * @param {Array | Matrix} a A (multi)set
28 * @return {Array} The powerset of the (multi)set
29 */
30 var setPowerset = typed('setPowerset', {
31 'Array | Matrix': function ArrayMatrix(a) {
32 if (subset(size(a), new MatrixIndex(0)) === 0) {
33 // if empty, return empty
34 return [];
35 }
36 var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural);
37 var result = [];
38 var number = 0;
39 while (number.toString(2).length <= b.length) {
40 result.push(_subset(b, number.toString(2).split('').reverse()));
41 number++;
42 }
43 // can not return a matrix, because of the different size of the subarrays
44 return _sort(result);
45 }
46 });
47
48 return setPowerset;
49
50 // create subset
51 function _subset(array, bitarray) {
52 var result = [];
53 for (var i = 0; i < bitarray.length; i++) {
54 if (bitarray[i] === '1') {
55 result.push(array[i]);
56 }
57 }
58 return result;
59 }
60
61 // sort subsests by length
62 function _sort(array) {
63 var temp = [];
64 for (var i = array.length - 1; i > 0; i--) {
65 for (var j = 0; j < i; j++) {
66 if (array[j].length > array[j + 1].length) {
67 temp = array[j];
68 array[j] = array[j + 1];
69 array[j + 1] = temp;
70 }
71 }
72 }
73 return array;
74 }
75}
76
77exports.name = 'setPowerset';
78exports.factory = factory;
\No newline at end of file