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