setPowerset.js 2.3 KB

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