"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKFachwahlmatrix = exports.KursblockungAlgorithmusKFachwahlmatrix = void 0;
const KursblockungAlgorithmusK_1 = require("../../core/kursblockung/KursblockungAlgorithmusK");
const System_1 = require("../../java/lang/System");
class KursblockungAlgorithmusKFachwahlmatrix extends KursblockungAlgorithmusK_1.KursblockungAlgorithmusK {
    /**
     * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
     * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
     *
     * @param logger Logger für Benutzerhinweise, Warnungen und Fehler.
     * @param dynDat Die dynamischen Blockungsdaten.
     */
    constructor(logger, dynDat) {
        super(logger, dynDat);
    }
    /**
     * Der Algorithmus entfernt zunächst alle SuS aus ihren Kursen. Anschließend
     * werden die Kurse zufällig verteilt.
     */
    berechne(pMaxTimeMillis) {
        if (this.dynDaten.gibKurseDieFreiSindAnzahl() === 0) {
            return;
        }
        let timeStart = System_1.System.currentTimeMillis();
        this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
        this.dynDaten.aktionKurseFreieZufaelligVerteilen();
        this.dynDaten.aktionZustandSpeichernK();
        let countKeineVerbesserung = 0;
        while (System_1.System.currentTimeMillis() - timeStart < pMaxTimeMillis) {
            if (this.berechneSchritt()) {
                countKeineVerbesserung = 0;
            }
            else {
                countKeineVerbesserung++;
                if (countKeineVerbesserung === 10000) {
                    break;
                }
            }
        }
    }
    /**
     * Die Lage einiger Kurse wird verändert. Falls sich die Bewertung
     * verschlechter, wird die Veränderung rückgängig gemacht.
     *
     * @return TRUE, falls sich die Bewertung verbessert hat.
     */
    berechneSchritt() {
        let maxChanges = 1;
        while (Math.random() < 0.5) {
            maxChanges++;
        }
        for (let changes = 0; changes < maxChanges; changes++) {
            this.dynDaten.aktionKursFreienEinenZufaelligVerteilen();
            if (this.dynDaten.gibBewertungJetztBesserAlsK() > 0) {
                this.dynDaten.aktionZustandSpeichernK();
                return true;
            }
        }
        this.dynDaten.aktionZustandLadenK();
        return false;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusKFachwahlmatrix', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusK'].includes(name);
    }
}
exports.KursblockungAlgorithmusKFachwahlmatrix = KursblockungAlgorithmusKFachwahlmatrix;
function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKFachwahlmatrix(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKFachwahlmatrix = cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKFachwahlmatrix;
//# sourceMappingURL=KursblockungAlgorithmusKFachwahlmatrix.js.map