Variable.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { JavaObject, cast_java_lang_Object } from '../../../java/lang/JavaObject';
  2. import { LinkedCollection, cast_de_nrw_schule_svws_core_adt_collection_LinkedCollection } from '../../../core/adt/collection/LinkedCollection';
  3. import { Clause, cast_de_nrw_schule_svws_core_kursblockung_satsolver_Clause } from '../../../core/kursblockung/satsolver/Clause';
  4. import { JavaString, cast_java_lang_String } from '../../../java/lang/JavaString';
  5. import { System, cast_java_lang_System } from '../../../java/lang/System';
  6. export class Variable extends JavaObject {
  7. readonly nr : number;
  8. readonly statSatFree : Array<Array<number>>;
  9. readonly clauses : LinkedCollection<Clause>;
  10. readonly neighbours : LinkedCollection<Variable>;
  11. index : number = 0;
  12. negation : Variable | null = null;
  13. /**
  14. * Konstruktor. Erzeugt eine neue Variable mit einer bestimmten Variablen-Nummer
  15. * (ungleich 0).
  16. *
  17. * @param pNr Die Nummer der Variablen (ungleich 0).
  18. */
  19. public constructor(pNr : number) {
  20. super();
  21. this.nr = pNr;
  22. this.statSatFree = [...Array(4)].map(e => Array(4).fill(0));
  23. this.clauses = new LinkedCollection();
  24. this.neighbours = new LinkedCollection();
  25. this.index = -3;
  26. this.negation = null;
  27. }
  28. public toString() : String {
  29. return "" + this.nr;
  30. }
  31. /**
  32. * Überprüft, ob diese Variable noch auf TRUE gesetzt werden kann.
  33. *
  34. * @return TRUE, falls man diese Variable und einen logischen Widerspruch
  35. * erfüllen kann.
  36. */
  37. public isUnsat() : boolean {
  38. if (this.statSatFree[0][0] > 0) {
  39. console.log(JSON.stringify("FEHLER: Dieser Fall darf gar nicht passieren."));
  40. return true;
  41. }
  42. if ((this.negation !== null) && (this.negation.statSatFree[0][1] > 0)) {
  43. return true;
  44. }
  45. return false;
  46. }
  47. /**
  48. * Vergleicht die Statistik zweier Variablen und bestimmt, für welche man sich
  49. * entscheiden sollte.
  50. *
  51. * @param b Die Variable, mit der verglichen werden soll.
  52. *
  53. * @return TRUE, wenn diese Instanz besser als "b" ist.
  54. */
  55. public isBetterThan(b : Variable) : boolean {
  56. let statB : Array<Array<number>> = b.statSatFree;
  57. if (this.statSatFree[0][0] > statB[0][0])
  58. return true;
  59. if (this.statSatFree[0][0] < statB[0][0])
  60. return false;
  61. if (this.statSatFree[0][1] > statB[0][1])
  62. return true;
  63. if (this.statSatFree[0][1] < statB[0][1])
  64. return false;
  65. if (this.statSatFree[0][2] > statB[0][2])
  66. return true;
  67. if (this.statSatFree[0][2] < statB[0][2])
  68. return false;
  69. if (this.statSatFree[0][3] > statB[0][3])
  70. return true;
  71. if (this.statSatFree[0][3] < statB[0][3])
  72. return false;
  73. return Math.random() < 0.5;
  74. }
  75. /**
  76. * Debug-Ausgabe. Nur für Testzwecke.
  77. */
  78. public debug() : void {
  79. console.log(JSON.stringify("DEBUGGING VAR " + this.nr));
  80. for (let r : number = 0; r < this.statSatFree.length; r++){
  81. for (let c : number = 0; c < this.statSatFree[r].length; c++){
  82. console.log(JSON.stringify(" " + this.statSatFree[r][c]));
  83. }
  84. console.log(JSON.stringify(" "));
  85. if (this.negation !== null) {
  86. for (let c : number = 0; c < this.negation.statSatFree[r].length; c++){
  87. console.log(JSON.stringify(" " + this.negation.statSatFree[r][c]));
  88. }
  89. }
  90. console.log();
  91. }
  92. }
  93. /**
  94. * Liefert die Anzahl an noch nicht erfüllten Klauseln.
  95. *
  96. * @return Die Anzahl an noch nicht erfüllten Klauseln.
  97. */
  98. getClauseOccurences() : number {
  99. let sum : number = 0;
  100. for (let free : number = 0; free < 4; free++){
  101. sum += this.statSatFree[0][free];
  102. }
  103. return sum;
  104. }
  105. isTranspiledInstanceOf(name : string): boolean {
  106. return ['de.nrw.schule.svws.core.kursblockung.satsolver.Variable'].includes(name);
  107. }
  108. }
  109. export function cast_de_nrw_schule_svws_core_kursblockung_satsolver_Variable(obj : unknown) : Variable {
  110. return obj as Variable;
  111. }