Heap.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.cast_de_nrw_schule_svws_core_kursblockung_satsolver_Heap = exports.Heap = void 0;
  4. const JavaObject_1 = require("../../../java/lang/JavaObject");
  5. const Arrays_1 = require("../../../java/util/Arrays");
  6. class Heap extends JavaObject_1.JavaObject {
  7. _data;
  8. _size = 0;
  9. /**
  10. * Konstruktor.
  11. */
  12. constructor() {
  13. super();
  14. this._data = Array(1).fill(null);
  15. this._size = 0;
  16. }
  17. toString() {
  18. return "Heap: " + Arrays_1.Arrays.toString(Arrays_1.Arrays.copyOf(this._data, this._size)).valueOf();
  19. }
  20. /**
  21. * Überprüft, ob der Heap leer ist.
  22. *
  23. * @return TRUE, wenn der Heap leer ist.
  24. */
  25. isEmpty() {
  26. return this._size === 0;
  27. }
  28. /**
  29. * Liefert das oberste (beste) Element des Heaps mit hoher Wahrscheinlichkeit.
  30. *
  31. * @return Liefert das oberste (beste) Element des Heaps mit hoher Wahrscheinlichkeit.
  32. */
  33. top() {
  34. let index = 0;
  35. while ((Math.random() < 0.1) && (index + 1 < this._size)) {
  36. index++;
  37. }
  38. return this._data[index];
  39. }
  40. /**
  41. * Liefert die Anzahl an Elementen im Heap.
  42. *
  43. * @return Die Anzahl an Elementen im Heap.
  44. */
  45. size() {
  46. return this._size;
  47. }
  48. /**
  49. * Fügt die Variable "var" dem Heap hinzu. Nach dem Einfügen kennt die Variable
  50. * mit {@link Variable#index} ihre eigene Position in diesem Heap.
  51. *
  52. * @param pVar Die einzufügende Variable.
  53. */
  54. insert(pVar) {
  55. if (this._size === this._data.length) {
  56. this._data = Arrays_1.Arrays.copyOf(this._data, 2 * this._size);
  57. }
  58. let insertI = this._size;
  59. while (insertI > 0) {
  60. let parentI = Math.trunc((insertI - 1) / 2);
  61. let parentV = this._data[parentI];
  62. if (pVar.isBetterThan(parentV)) {
  63. this._data[insertI] = parentV;
  64. parentV.index = insertI;
  65. insertI = parentI;
  66. }
  67. else {
  68. break;
  69. }
  70. }
  71. this._data[insertI] = pVar;
  72. pVar.index = insertI;
  73. this._size++;
  74. }
  75. /**
  76. * Entfernt die Variable pVar vom Heap. Dabei wird zunächst mit Hilfe von
  77. * {@link Variable#index} die Position bestimmt. Anschließend wird der Heap so
  78. * transformiert, dass die Variable entfernt werden kann.
  79. *
  80. * @param pVar Die zu entfernende Variable.
  81. */
  82. remove(pVar) {
  83. this._size--;
  84. let lastV = this._data[this._size];
  85. if (lastV === pVar) {
  86. return;
  87. }
  88. let currentI = pVar.index;
  89. if (this._data[pVar.index] !== pVar) {
  90. console.log(JSON.stringify("FEHLER: Die Variable " + pVar + " ist nicht beim Index " + pVar.index + "!"));
  91. }
  92. while (currentI > 0) {
  93. let parentI = Math.trunc((currentI - 1) / 2);
  94. this._data[currentI] = this._data[parentI];
  95. this._data[currentI].index = currentI;
  96. currentI = parentI;
  97. }
  98. let parentI = 0;
  99. let childI = 1;
  100. while (childI < this._size) {
  101. if (childI + 1 < this._size) {
  102. if (this._data[childI + 1].isBetterThan(this._data[childI])) {
  103. childI = childI + 1;
  104. }
  105. }
  106. let child = this._data[childI];
  107. if (child.isBetterThan(lastV)) {
  108. this._data[parentI] = child;
  109. child.index = parentI;
  110. parentI = childI;
  111. childI = parentI * 2 + 1;
  112. }
  113. else {
  114. break;
  115. }
  116. }
  117. this._data[parentI] = lastV;
  118. lastV.index = parentI;
  119. }
  120. /**
  121. * Falls sich die Variable pVar im Heap befindet, wird sie entfernt und direkt
  122. * wieder hinzugefügt. Diese Methode muss aufgerufen werden, sobald die Variable
  123. * eine neue Bewertung erhalten hat.
  124. *
  125. * @param pVar Die Variable, deren Bewertung sich geändert hat.
  126. */
  127. update(pVar) {
  128. if (pVar.index >= 0) {
  129. this.remove(pVar);
  130. if (pVar.negation !== null)
  131. this.remove(pVar.negation);
  132. this.insert(pVar);
  133. if (pVar.negation !== null)
  134. this.insert(pVar.negation);
  135. }
  136. }
  137. isTranspiledInstanceOf(name) {
  138. return ['de.nrw.schule.svws.core.kursblockung.satsolver.Heap'].includes(name);
  139. }
  140. }
  141. exports.Heap = Heap;
  142. function cast_de_nrw_schule_svws_core_kursblockung_satsolver_Heap(obj) {
  143. return obj;
  144. }
  145. exports.cast_de_nrw_schule_svws_core_kursblockung_satsolver_Heap = cast_de_nrw_schule_svws_core_kursblockung_satsolver_Heap;
  146. //# sourceMappingURL=Heap.js.map