KursblockungDynStatistik.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
  2. import { KursblockungDynKurs, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynKurs } from '../../core/kursblockung/KursblockungDynKurs';
  3. import { Arrays, cast_java_util_Arrays } from '../../java/util/Arrays';
  4. import { System, cast_java_lang_System } from '../../java/lang/System';
  5. export class KursblockungDynStatistik extends JavaObject {
  6. private matrixFachartPaar : Array<Array<number>> = [...Array(0)].map(e => Array(0).fill(0));
  7. private bewertungFachartPaar : number = 0;
  8. private bewertungFachartPaarSaveS : number = 0;
  9. private bewertungFachartPaarSaveK : number = 0;
  10. private bewertungNichtwahlen : number = 0;
  11. private bewertungNichtwahlenSaveS : number = 0;
  12. private bewertungNichtwahlenSaveK : number = 0;
  13. private bewertungKursdifferenzen : Array<number> = Array(0).fill(0);
  14. private bewertungKursdifferenzenSaveS : Array<number> = Array(0).fill(0);
  15. private bewertungKursdifferenzenSaveK : Array<number> = Array(0).fill(0);
  16. private bewertungKursdifferenzenMaxIndex : number = 0;
  17. /**
  18. * Initialisiert alle Attribute mit Dummy-Werten.
  19. */
  20. public constructor() {
  21. super();
  22. this.clear();
  23. }
  24. /**
  25. * Initialisiert alle Attribute mit Dummy-Werten. Setzt alle Werte auf 0 und
  26. * initialisiert alle Arrays auf Länge 0.
  27. */
  28. public clear() : void {
  29. this.bewertungFachartPaar = 0;
  30. this.bewertungFachartPaarSaveS = 0;
  31. this.bewertungFachartPaarSaveK = 0;
  32. this.bewertungNichtwahlen = 0;
  33. this.bewertungNichtwahlenSaveS = 0;
  34. this.bewertungNichtwahlenSaveK = 0;
  35. this.matrixFachartPaar = [...Array(0)].map(e => Array(0).fill(0));
  36. this.bewertungKursdifferenzen = Array(0).fill(0);
  37. this.bewertungKursdifferenzenSaveS = Array(0).fill(0);
  38. this.bewertungKursdifferenzenSaveK = Array(0).fill(0);
  39. this.bewertungKursdifferenzenMaxIndex = 0;
  40. }
  41. /**
  42. * Initialisiert dieses Objekt mit den Anfangswerten.
  43. *
  44. * @param pMatrixFachartPaar Das 2D-Array beinhaltet pro Fachart-Paar eine
  45. * Bewertung.
  46. * @param pMaxSchueler Die maximale Anzahl an Schülern.
  47. * @param pMaxFacharten Die maximale Anzahl an Facharten.
  48. */
  49. public aktionInitialisiere(pMatrixFachartPaar : Array<Array<number>>, pMaxSchueler : number, pMaxFacharten : number) : void {
  50. this.matrixFachartPaar = pMatrixFachartPaar;
  51. this.bewertungKursdifferenzen = Array(pMaxSchueler + 1).fill(0);
  52. this.bewertungKursdifferenzenSaveS = Array(pMaxSchueler + 1).fill(0);
  53. this.bewertungKursdifferenzenSaveK = Array(pMaxSchueler + 1).fill(0);
  54. this.bewertungKursdifferenzen[0] = pMaxFacharten;
  55. this.bewertungKursdifferenzenSaveS[0] = pMaxFacharten;
  56. this.bewertungKursdifferenzenSaveK[0] = pMaxFacharten;
  57. }
  58. /**
  59. * Liefert die aktuelle Fachart-Paar-Bewertung.
  60. *
  61. * @return Die aktuelle Fachart-Paar-Bewertung.
  62. */
  63. public gibBewertungFachartPaar() : number {
  64. return this.bewertungFachartPaar;
  65. }
  66. /**
  67. * Liefert die aktuelle Anzahl an Nichtwahlen. Das ist die Summe aller Kurs, die
  68. * bei Schülern nicht zugeordnet wurden.
  69. *
  70. * @return Die aktuelle Anzahl an Nichtwahlen.
  71. */
  72. public gibBewertungNichtwahlen() : number {
  73. return this.bewertungNichtwahlen;
  74. }
  75. /**
  76. * Liefert die aktuell größte Kursdifferenz (über alle Facharten).
  77. *
  78. * @return Die aktuell größte Kursdifferenz (über alle Facharten).
  79. */
  80. public gibBewertungKursdifferenz() : number {
  81. return this.bewertungKursdifferenzenMaxIndex;
  82. }
  83. /**
  84. * Informiert die Statistik, dass ein Kurs-Paar hinzuzufügen ist.
  85. *
  86. * @param pKurs1 Der 1. Kurs des Kurs-Paares.
  87. * @param pKurs2 Der 2. Kurs des Kurs-Paares.
  88. */
  89. public aktionKurspaarInSchieneHinzufuegen(pKurs1 : KursblockungDynKurs, pKurs2 : KursblockungDynKurs) : void {
  90. let nr1 : number = pKurs1.gibFachart().gibNr();
  91. let nr2 : number = pKurs2.gibFachart().gibNr();
  92. this.bewertungFachartPaar += this.matrixFachartPaar[nr1][nr2];
  93. }
  94. /**
  95. * Informiert die Statistik, dass ein Kurs-Paar zu entfernen ist.
  96. *
  97. * @param pKurs1 Der 1. Kurs des Kurs-Paares.
  98. * @param pKurs2 Der 2. Kurs des Kurs-Paares.
  99. */
  100. public aktionKurspaarInSchieneEntfernen(pKurs1 : KursblockungDynKurs, pKurs2 : KursblockungDynKurs) : void {
  101. let nr1 : number = pKurs1.gibFachart().gibNr();
  102. let nr2 : number = pKurs2.gibFachart().gibNr();
  103. this.bewertungFachartPaar -= this.matrixFachartPaar[nr1][nr2];
  104. }
  105. /**
  106. * Informiert die Statistik über eine Veränderung der Nichtwahlen.
  107. *
  108. * @param pVeraenderung Die Veränderungen der Nichtwahlen (negative Werte sind
  109. * möglich).
  110. */
  111. public aktionNichtwahlenVeraendern(pVeraenderung : number) : void {
  112. this.bewertungNichtwahlen += pVeraenderung;
  113. }
  114. /**
  115. * Entfernt eine Kursdifferenz {@code pIndex} aus dem Histogramm
  116. * {@link KursblockungDynStatistik#bewertungKursdifferenzen} aller
  117. * Kursdifferenzen. Der Index des größten Nicht-Null-Wertes
  118. * {@link KursblockungDynStatistik#bewertungKursdifferenzenMaxIndex} wird dabei
  119. * möglicherweise kleiner. <br>
  120. * {@code Beispiel vorher: 5, 0, 6, 0, 0, 1*, 0, 0, 0}<br>
  121. * {@code Beispiel danach: 5, 0, 6*, 0, 0, 0, 0, 0, 0}<br>
  122. *
  123. * @param pIndex Die Kursdifferenz von der es eine weniger geben soll.
  124. */
  125. public aktionKursdifferenzEntfernen(pIndex : number) : void {
  126. this.bewertungKursdifferenzen[pIndex]--;
  127. if (pIndex === this.bewertungKursdifferenzenMaxIndex) {
  128. while ((this.bewertungKursdifferenzen[this.bewertungKursdifferenzenMaxIndex] === 0) && (this.bewertungKursdifferenzenMaxIndex > 0)) {
  129. this.bewertungKursdifferenzenMaxIndex--;
  130. }
  131. }
  132. }
  133. /**
  134. * Fügt eine Kursdifferenz {@code pIndex} dem Histogramm
  135. * {@link KursblockungDynStatistik#bewertungKursdifferenzen} aller
  136. * Kursdifferenzen hinzu. Der Index des größten Nicht-Null-Wertes
  137. * {@link KursblockungDynStatistik#bewertungKursdifferenzenMaxIndex} wird dabei
  138. * möglicherweise größer. <br>
  139. * {@code Beispiel vorher: 5, 0, 6*, 0, 0, 0, 0, 0, 0}<br>
  140. * {@code Beispiel danach: 5, 0, 6, 0, 0, 1*, 0, 0, 0}<br>
  141. *
  142. * @param pIndex Die Kursdifferenz von der es eine weniger geben soll.
  143. */
  144. public aktionKursdifferenzHinzufuegen(pIndex : number) : void {
  145. this.bewertungKursdifferenzen[pIndex]++;
  146. if (pIndex > this.bewertungKursdifferenzenMaxIndex) {
  147. this.bewertungKursdifferenzenMaxIndex = pIndex;
  148. }
  149. }
  150. /**
  151. * Ausgabe von Debug-Informationen. Nur für Testzwecke.
  152. */
  153. public debug() : void {
  154. console.log(JSON.stringify("NW = " + this.bewertungNichtwahlen + ", KDs = " + Arrays.toString(this.bewertungKursdifferenzen).valueOf()));
  155. }
  156. /**
  157. * Speichert die aktuellen Werte (im Zustand S). Die Methoden
  158. * {@link KursblockungDynStatistik#gibBewertung_NW_KD_JetztS} und
  159. * {@link KursblockungDynStatistik#gibBewertungFachartPaarSchlechter} bedienen
  160. * sich dann der ehemaligen Werte um festzustellen, ob es eine Verschlechterung
  161. * gab.
  162. *
  163. */
  164. public aktionBewertungSpeichernS() : void {
  165. this.bewertungNichtwahlenSaveS = this.bewertungNichtwahlen;
  166. this.bewertungFachartPaarSaveS = this.bewertungFachartPaar;
  167. System.arraycopy(this.bewertungKursdifferenzen, 0, this.bewertungKursdifferenzenSaveS, 0, this.bewertungKursdifferenzen.length);
  168. }
  169. /**
  170. * Speichert die aktuellen Werte (im Zustand K). Die Methoden
  171. * {@link KursblockungDynStatistik#gibBewertung_NW_KD_JetztK()} und
  172. * {@link KursblockungDynStatistik#gibBewertungFachartPaarSchlechter} bedienen
  173. * sich dann der ehemaligen Werte um festzustellen, ob es eine Verschlechterung
  174. * gab.
  175. *
  176. */
  177. public aktionBewertungSpeichernK() : void {
  178. this.bewertungNichtwahlenSaveK = this.bewertungNichtwahlen;
  179. this.bewertungFachartPaarSaveK = this.bewertungFachartPaar;
  180. System.arraycopy(this.bewertungKursdifferenzen, 0, this.bewertungKursdifferenzenSaveK, 0, this.bewertungKursdifferenzen.length);
  181. }
  182. /**
  183. * Liefert den Wert {@code -1, 0 oder +1}, falls die Bewertung (Nichtwahlen,
  184. * Kursdiffenzen) des Zustandes S sich verschlechtert (-1), sich verbessert (+1)
  185. * hat oder gleichgeblieben (0) ist.
  186. *
  187. * @return {@code -1, 0 oder +1}, falls die Bewertung (Nichtwahlen,
  188. * Kursdiffenzen) des Zustandes K sich verschlechtert (-1), sich
  189. * verbessert (+1) hat oder gleichgeblieben (0) ist.
  190. */
  191. public gibBewertung_NW_KD_JetztS() : number {
  192. if (this.bewertungNichtwahlen > this.bewertungNichtwahlenSaveS) {
  193. return -1;
  194. }
  195. if (this.bewertungNichtwahlen < this.bewertungNichtwahlenSaveS) {
  196. return +1;
  197. }
  198. for (let i : number = this.bewertungKursdifferenzen.length - 1; i >= 0; i--){
  199. if (this.bewertungKursdifferenzen[i] === this.bewertungKursdifferenzenSaveS[i]) {
  200. continue;
  201. }
  202. if (this.bewertungKursdifferenzen[i] > this.bewertungKursdifferenzenSaveS[i]) {
  203. return -1;
  204. }
  205. if (this.bewertungKursdifferenzen[i] < this.bewertungKursdifferenzenSaveS[i]) {
  206. return +1;
  207. }
  208. }
  209. return 0;
  210. }
  211. /**
  212. * Liefert den Wert {@code -1, 0 oder +1}, falls die Bewertung (Nichtwahlen,
  213. * Kursdiffenzen) des Zustandes K sich verschlechtert (-1), sich verbessert (+1)
  214. * hat oder gleichgeblieben (0) ist.
  215. *
  216. * @return {@code -1, 0 oder +1}, falls die Bewertung (Nichtwahlen,
  217. * Kursdiffenzen) des Zustandes K sich verschlechtert (-1), sich
  218. * verbessert (+1) hat oder gleichgeblieben (0) ist.
  219. */
  220. public gibBewertung_NW_KD_JetztK() : number {
  221. if (this.bewertungNichtwahlen > this.bewertungNichtwahlenSaveK) {
  222. return -1;
  223. }
  224. if (this.bewertungNichtwahlen < this.bewertungNichtwahlenSaveK) {
  225. return +1;
  226. }
  227. for (let i : number = this.bewertungKursdifferenzen.length - 1; i >= 0; i--){
  228. if (this.bewertungKursdifferenzen[i] === this.bewertungKursdifferenzenSaveK[i]) {
  229. continue;
  230. }
  231. if (this.bewertungKursdifferenzen[i] > this.bewertungKursdifferenzenSaveK[i]) {
  232. return -1;
  233. }
  234. if (this.bewertungKursdifferenzen[i] < this.bewertungKursdifferenzenSaveK[i]) {
  235. return +1;
  236. }
  237. }
  238. if (this.bewertungFachartPaar > this.bewertungFachartPaarSaveK) {
  239. return -1;
  240. }
  241. if (this.bewertungFachartPaar < this.bewertungFachartPaarSaveK) {
  242. return +1;
  243. }
  244. return 0;
  245. }
  246. /**
  247. * Liefert den Wert {@code true}, falls die Bewertung (bewertungFachartPaar) des
  248. * Zustandes S sich verschlechtert hat.
  249. *
  250. * @return {@code true}, falls die Bewertung (bewertungFachartPaar) des
  251. * Zustandes S sich verschlechtert hat.
  252. */
  253. public gibBewertungFachartPaarSchlechter() : boolean {
  254. if (this.bewertungFachartPaar > this.bewertungFachartPaarSaveS) {
  255. return true;
  256. }
  257. if (this.bewertungFachartPaar < this.bewertungFachartPaarSaveS) {
  258. return false;
  259. }
  260. return false;
  261. }
  262. /**
  263. * Liefert den Wert {@code true}, falls die Bewertung (bewertungFachartPaar) des
  264. * Zustandes K sich verschlechtert hat.
  265. *
  266. * @return {@code true}, falls die Bewertung (bewertungFachartPaar) des
  267. * Zustandes K sich verschlechtert hat.
  268. */
  269. public gibBewertungFachartPaarSchlechterK() : boolean {
  270. if (this.bewertungFachartPaar > this.bewertungFachartPaarSaveK) {
  271. return true;
  272. }
  273. if (this.bewertungFachartPaar < this.bewertungFachartPaarSaveK) {
  274. return false;
  275. }
  276. return false;
  277. }
  278. isTranspiledInstanceOf(name : string): boolean {
  279. return ['de.nrw.schule.svws.core.kursblockung.KursblockungDynStatistik'].includes(name);
  280. }
  281. }
  282. export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynStatistik(obj : unknown) : KursblockungDynStatistik {
  283. return obj as KursblockungDynStatistik;
  284. }