123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynSchueler = exports.KursblockungDynSchueler = void 0;
- const JavaObject_1 = require("../../java/lang/JavaObject");
- const KursblockungStatic_1 = require("../../core/kursblockung/KursblockungStatic");
- const KursblockungMatrix_1 = require("../../core/kursblockung/KursblockungMatrix");
- const System_1 = require("../../java/lang/System");
- const KursblockungOutputFachwahlZuKurs_1 = require("../../core/data/kursblockung/KursblockungOutputFachwahlZuKurs");
- class KursblockungDynSchueler extends JavaObject_1.JavaObject {
- representation;
- fachartArr;
- fachartZuGUI;
- fachartZuKurs;
- fachartZuKursSaveS;
- fachartZuKursSaveK;
- statistik;
- nichtwahlen = 0;
- schieneBelegt;
- static dummy = new KursblockungMatrix_1.KursblockungMatrix(0, 0);
- matrix;
- /**
- * Im Konstruktor wird {@code pSchueler} in ein Objekt dieser Klasse
- * umgewandelt.
- *
- * @param pStatistik Referenz um die Nichtwahlen mitzuteilen.
- * @param pSchueler Die Schüler-Daten von der GUI/DB.
- * @param pSchienenAnzahl Wir benötigt, um {@link #schieneBelegt} zu
- * initialisieren.
- */
- constructor(pSchueler, pStatistik, pSchienenAnzahl) {
- super();
- this.representation = pSchueler.representation;
- this.statistik = pStatistik;
- this.fachartArr = Array(0).fill(null);
- this.fachartZuGUI = Array(0).fill(0);
- this.fachartZuKurs = Array(0).fill(null);
- this.fachartZuKursSaveS = Array(0).fill(null);
- this.fachartZuKursSaveK = Array(0).fill(null);
- this.nichtwahlen = 0;
- this.schieneBelegt = Array(pSchienenAnzahl).fill(false);
- this.matrix = KursblockungDynSchueler.dummy;
- }
- toString() {
- return this.representation;
- }
- /**
- * Eine String-Darstellung des Schülers. Beinhaltet meistens den Vornamen, den
- * Nachnamen, das Geburtsdatum und das Geschlecht.
- *
- * @return Eine String-Darstellung des Schülers.
- */
- gibRepresentation() {
- return this.representation;
- }
- /**
- * Liefert die aktuelle Anzahl an Nichtwahlen.
- *
- * @return Die aktuelle Anzahl an Nichtwahlen.
- */
- gibNichtwahlen() {
- return this.nichtwahlen;
- }
- /**
- * Liefert ein Array aller Facherten (= Fachwahlen) des Schülers.
- *
- * @return Ein Array aller Facherten (= Fachwahlen) des Schülers.
- */
- gibFacharten() {
- return this.fachartArr;
- }
- /**
- * Setzt alle Facharten (=Fachwahlen) des Schülers.
- *
- * @param pFacharten Die Facharten des Schülers.
- * @param pIDs Die zur Fachwahl zugehörige ID der GUI bzw. Datenbank.
- */
- aktionSetzeFachartenUndIDs(pFacharten, pIDs) {
- let nFacharten = pFacharten.length;
- this.fachartArr = pFacharten;
- this.fachartZuGUI = pIDs;
- this.fachartZuKurs = Array(nFacharten).fill(null);
- this.fachartZuKursSaveS = Array(nFacharten).fill(null);
- this.fachartZuKursSaveK = Array(nFacharten).fill(null);
- this.statistik.aktionNichtwahlenVeraendern(nFacharten);
- this.nichtwahlen = nFacharten;
- for (let i = 1; i < nFacharten; i++) {
- for (let j = i; j >= 1; j--) {
- let anzL = this.fachartArr[j - 1].gibKurseMax();
- let anzR = this.fachartArr[j].gibKurseMax();
- if (anzL > anzR) {
- let fL = this.fachartArr[j - 1];
- let fR = this.fachartArr[j];
- let valL = this.fachartZuGUI[j - 1];
- let valR = this.fachartZuGUI[j];
- this.fachartArr[j - 1] = fR;
- this.fachartArr[j] = fL;
- this.fachartZuGUI[j - 1] = valR;
- this.fachartZuGUI[j] = valL;
- }
- }
- }
- this.matrix = new KursblockungMatrix_1.KursblockungMatrix(nFacharten, this.schieneBelegt.length);
- }
- /**
- * Speichert die aktuell belegten Kurse im Zustand S.
- */
- aktionZustandSpeichernS() {
- System_1.System.arraycopy(this.fachartZuKurs, 0, this.fachartZuKursSaveS, 0, this.fachartZuKurs.length);
- }
- /**
- * Speichert die aktuell belegten Kurse im Zustand K.
- */
- aktionZustandSpeichernK() {
- System_1.System.arraycopy(this.fachartZuKurs, 0, this.fachartZuKursSaveK, 0, this.fachartZuKurs.length);
- }
- /**
- * Entfernt zunächst den Schüler aus seinen aktuellen Kursen und setzt ihn dann
- * in die Kurse, die zuvor im Zustand S gespeichert wurden.
- */
- aktionZustandLadenS() {
- this.aktionWaehleKurse(this.fachartZuKursSaveS);
- }
- /**
- * Entfernt zunächst den Schüler aus seinen aktuellen Kursen und setzt ihn dann
- * in die Kurse, die zuvor im Zustand K gespeichert wurden.
- */
- aktionZustandLadenK() {
- this.aktionWaehleKurse(this.fachartZuKursSaveK);
- }
- aktionWaehleKurse(wahl) {
- this.aktionKurseAlleEntfernen();
- for (let i = 0; i < this.fachartZuKurs.length; i++) {
- let kurs = wahl[i];
- if (kurs !== null) {
- this.aktionKursHinzufuegen(i, kurs);
- }
- }
- }
- /**
- * Entfernt den Schüler aus seinen aktuell zugeordneten Kursen.
- */
- aktionKurseAlleEntfernen() {
- for (let i = 0; i < this.fachartArr.length; i++) {
- let kurs = this.fachartZuKurs[i];
- if (kurs !== null) {
- this.aktionKursEntfernen(i, kurs);
- }
- }
- }
- /**
- * Geht die Facharten durch (Facharten mit einer kleineren Kursanzahl zuerst)
- * und geht dann pro Fachart alle Kurse durch (Kurse mit kleinerer Schüleranzahl
- * zuerst). Falls der Kurs wählbar ist, wird der Schüler hinzugefügt und es geht
- * weiter mit der nächsten Fachart. Ein Kurs ist wählbar, wenn nicht bereits ein
- * Kurs zugeordnet wurde und die Schienen in den der Kurs sind frei sind.<br>
- *
- * Falls der Paramter {@code pNurMultikurse} TRUE ist, dann werden nur
- * Multikurse verteilt.
- *
- * @param pNurMultikurse Falls TRUE ist, dann werden nur Multikurse verteilt.
- */
- aktionKurseZufaelligVerteilen(pNurMultikurse) {
- let perm = KursblockungStatic_1.KursblockungStatic.gibPermutation(this.fachartArr.length);
- for (let p = 0; p < this.fachartArr.length; p++) {
- let i = perm[p];
- if (this.fachartZuKurs[i] !== null) {
- continue;
- }
- let fachart = this.fachartArr[i];
- if (pNurMultikurse) {
- if (!fachart.gibHatMultikurs()) {
- continue;
- }
- }
- let kurse = fachart.gibKurse();
- let perm2 = KursblockungStatic_1.KursblockungStatic.gibPermutation(kurse.length);
- for (let p2 = 0; p2 < perm2.length; p2++) {
- let i2 = p2;
- let kurs = kurse[i2];
- let waehlbar = true;
- for (let nr of kurs.gibSchienenLage()) {
- if (this.schieneBelegt[nr]) {
- waehlbar = false;
- }
- }
- if (waehlbar) {
- this.aktionKursHinzufuegen(i, kurs);
- break;
- }
- }
- }
- }
- /**
- * Verteilt alle Kurse die über genau 1 Schiene gehen mit Hilfe eines Matching
- * Algorithmus.
- */
- aktionKurseMitBipartiteMatchingVerteilen() {
- let data = this.matrix.getMatrix();
- for (let r = 0; r < this.fachartArr.length; r++) {
- for (let c = 0; c < this.schieneBelegt.length; c++) {
- data[r][c] = 0;
- }
- if (this.fachartZuKurs[r] !== null) {
- continue;
- }
- if (this.fachartArr[r].gibHatMultikurs()) {
- continue;
- }
- for (let kurs of this.fachartArr[r].gibKurse()) {
- for (let nr of kurs.gibSchienenLage()) {
- if (!this.schieneBelegt[nr]) {
- data[r][nr] = 1;
- }
- }
- }
- }
- let r2c = this.matrix.gibMaximalesBipartitesMatching(true);
- for (let r = 0; r < this.fachartArr.length; r++) {
- if (this.fachartZuKurs[r] !== null) {
- continue;
- }
- let c = r2c[r];
- if (c === -1) {
- continue;
- }
- let kursGefunden = null;
- for (let kurs of this.fachartArr[r].gibKurse()) {
- for (let nr of kurs.gibSchienenLage()) {
- if ((nr === c) && (kursGefunden === null)) {
- kursGefunden = kurs;
- }
- }
- }
- if (kursGefunden !== null)
- this.aktionKursHinzufuegen(r, kursGefunden);
- }
- }
- /**
- * Erzeugt pro Fachwahl ein Objekt des Typs
- * {@link KursblockungOutputFachwahlZuKurs} und fügt es dem Vector
- * {@code vFachwahlZuKurs} hinzu. Die GUI kann daraus die
- * Schüler-Zu-Kurs-Zuordnungen rekonstruiern.
- *
- * @param vFachwahlZuKurs Fügt diesem Vector pro Fachwahl ein Objekt des Typs
- * {@link KursblockungOutputFachwahlZuKurs} hinzu.
- */
- aktionOutputsErzeugen(vFachwahlZuKurs) {
- for (let i = 0; i < this.fachartArr.length; i++) {
- let fachwahlZuKurs = new KursblockungOutputFachwahlZuKurs_1.KursblockungOutputFachwahlZuKurs();
- fachwahlZuKurs.fachwahl = this.fachartZuGUI[i];
- let tmpKurs = this.fachartZuKurs[i];
- fachwahlZuKurs.kurs = (tmpKurs === null) ? -1 : tmpKurs.gibID();
- vFachwahlZuKurs.add(fachwahlZuKurs);
- }
- }
- /**
- * Liefert TRUE, falls der Schüler mindestens einen Multikurs hat. Ein Multikurs
- * ist ein Kurs, der über mehr als eine Schiene geht.
- *
- * @return TRUE, falls der Schüler mindestens einen Multikurs hat.
- */
- gibHatMultikurs() {
- for (let fachart of this.fachartArr) {
- if (fachart.gibHatMultikurs()) {
- return true;
- }
- }
- return false;
- }
- aktionKursHinzufuegen(fachartIndex, kurs) {
- kurs.aktionSchuelerHinzufügen();
- this.statistik.aktionNichtwahlenVeraendern(-1);
- this.nichtwahlen--;
- for (let nr of kurs.gibSchienenLage()) {
- if (this.schieneBelegt[nr]) {
- console.log(JSON.stringify("FEHLER: Schienen-Doppelbelegung! " + this.representation.valueOf()));
- }
- this.schieneBelegt[nr] = true;
- }
- this.fachartZuKurs[fachartIndex] = kurs;
- }
- aktionKursEntfernen(fachartIndex, kurs) {
- kurs.aktionSchuelerEntfernen();
- this.statistik.aktionNichtwahlenVeraendern(+1);
- this.nichtwahlen++;
- for (let nr of kurs.gibSchienenLage()) {
- if (!this.schieneBelegt[nr]) {
- console.log(JSON.stringify("FEHLER: Kurs ist gar nicht in Schiene ! " + this.representation.valueOf()));
- }
- this.schieneBelegt[nr] = false;
- }
- this.fachartZuKurs[fachartIndex] = null;
- }
- isTranspiledInstanceOf(name) {
- return ['de.nrw.schule.svws.core.kursblockung.KursblockungDynSchueler'].includes(name);
- }
- }
- exports.KursblockungDynSchueler = KursblockungDynSchueler;
- function cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynSchueler(obj) {
- return obj;
- }
- exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynSchueler = cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynSchueler;
- //# sourceMappingURL=KursblockungDynSchueler.js.map
|