attestation-to-examiner-distribution
Version:
An API to calculate the precedence diagram method
244 lines (243 loc) • 9.79 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const csv = require('csvtojson');
class JSONToGraph {
static getWeekday(date) {
return JSONToGraph.getWeekdayByNumber(date.getDay());
}
static getWeekdayTranslation(weekday) {
let translation = {
"Monday": "Montag",
"Tuesday": "Dienstag",
"Wednesday": "Mittwoch",
"Thursday": "Donnerstag",
"Friday": "Freitag",
"Saturday": "Samstag",
"Sunday": "Sonntag",
};
//@ts-ignore
return translation[weekday];
}
static getWeekdayByNumber(number) {
number = number % 7;
let weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
return weekdays[number];
}
static getWorkingWeekdays() {
let offset = 1;
let weekdays = [];
for (let i = 0; i < 5; i++) {
let weekday = JSONToGraph.getWeekdayByNumber(i + offset);
weekdays.push(weekday);
}
return weekdays;
}
static getTimeslots() {
let startHour = 8;
let endHour = 20;
let minuteStep = 20;
let minutesPerHour = 60;
let timeslots = [];
for (let i = startHour; i < endHour; i++) {
for (let j = 0; j < minutesPerHour; j += minuteStep) {
let hour = i < 10 ? "0" + i : i;
let minute = j < 10 ? "0" + j : j;
timeslots.push(hour + ":" + minute);
}
}
return timeslots;
}
static getSlotId(slot) {
return JSONToGraph.getSlotIdFromFields(slot.time, slot.day, slot.tutor);
}
static getSlotIdFromFields(time, day, tutor) {
return time + "-" + day + "-" + tutor;
}
static getAllSlotsFromTutors(parsedJSON) {
let slots = {};
let tutorsDict = parsedJSON.tutors;
let tutors = Object.keys(tutorsDict);
for (const tutor of tutors) {
let tutorSlots = tutorsDict[tutor];
let days = Object.keys(tutorSlots);
for (const day of days) {
let timeDict = tutorSlots[day];
let times = Object.keys(timeDict);
for (const time of times) {
let slot = {
tutor: tutor,
day: day,
time: time,
};
//@ts-ignore
slot.id = JSONToGraph.getSlotId(slot);
// @ts-ignore
slots[slot.id] = slot;
}
}
}
return slots;
}
static getGraphAndVerticeMaps(parsedJSON, tutorCapacity, dictTutorToIndividualDiff) {
//console.log("getGraphAndVerticeMaps: with tutorCapacity: "+tutorCapacity)
var _a;
let result = {
source: 0,
sink: 1,
graph: {},
nameToVertice: {},
verticeToName: {},
slotsWithNames: {},
};
let source = result.source;
let sink = result.sink;
let defaultCapacity = 1;
let groupCapacity = defaultCapacity;
let currentVertice = 2; // source and sink are 0 and 1
// Create group verticies
let groups = parsedJSON.groups;
let groupNames = Object.keys(groups);
for (const groupName of groupNames) {
let groupVertice = currentVertice;
//@ts-ignore
result.nameToVertice[groupName] = groupVertice;
//@ts-ignore
result.verticeToName[groupVertice] = groupName;
//@ts-ignore // empty group slot
result.graph[groupVertice] = result.graph[groupVertice] || {};
currentVertice += 1;
}
// Add edges from source to groups
for (const groupName of groupNames) {
//@ts-ignore
let groupVertice = result.nameToVertice[groupName];
//@ts-ignore
result.graph[source] = result.graph[source] || {};
// console.log("Adding edge from source to groupVertice: "+groupVertice)
//@ts-ignore
result.graph[source][groupVertice] = {
flow: 0,
capacity: groupCapacity,
from: source,
type: "source-to-group",
to: groupVertice,
};
}
// Create slot verticies
let slotsWithNames = JSONToGraph.getAllSlotsFromTutors(parsedJSON);
result.slotsWithNames = slotsWithNames;
let slots = Object.keys(slotsWithNames);
for (const slot of slots) {
let slotVertice = currentVertice;
//@ts-ignore
result.nameToVertice[slot] = slotVertice;
//@ts-ignore
result.verticeToName[slotVertice] = slot;
//@ts-ignore // empty slot
result.graph[slotVertice] = result.graph[slotVertice] || {};
currentVertice += 1;
}
// Add edges from groups possibleSlots to slots
for (const groupName of groupNames) {
//@ts-ignore
let groupVertice = result.nameToVertice[groupName];
let group = groups[groupName];
let groupPossibleSlots = group.possibleSlots;
let days = Object.keys(groupPossibleSlots);
for (const day of days) {
let timeDict = groupPossibleSlots[day];
let times = Object.keys(timeDict);
for (const time of times) {
let allSlotNames = Object.keys(slotsWithNames);
for (const slotName of allSlotNames) {
let slot = slotsWithNames[slotName];
if (slot.day === day && slot.time === time) {
//@ts-ignore
let slotVertice = result.nameToVertice[slotName];
//@ts-ignore
result.graph[groupVertice] = result.graph[groupVertice] || {};
//console.log("Adding edge from groupVertice: "+groupVertice+" to slotVertice: "+slotVertice)
//@ts-ignore
result.graph[groupVertice][slotVertice] = {
flow: 0,
capacity: defaultCapacity,
from: groupVertice,
type: "group-to-slot",
to: slotVertice,
};
}
}
}
}
}
// Create tutor verticies
let tutorsDict = parsedJSON.tutors;
let tutors = Object.keys(tutorsDict);
for (const tutor of tutors) {
let tutorVertice = currentVertice;
//@ts-ignore
result.nameToVertice[tutor] = tutorVertice;
//@ts-ignore
result.verticeToName[tutorVertice] = tutor;
//@ts-ignore // empty tutor slot
result.graph[tutorVertice] = result.graph[tutorVertice] || {};
currentVertice += 1;
}
// Add edges from slots to tutors
for (const slot of slots) {
//@ts-ignore
let slotVertice = result.nameToVertice[slot];
let slotInfo = slotsWithNames[slot];
let tutor = slotInfo.tutor;
//@ts-ignore
let tutorVertice = result.nameToVertice[tutor];
//@ts-ignore
result.graph[slotVertice] = result.graph[slotVertice] || {};
//console.log("Adding edge from slotVertice: "+slotVertice+" to tutorVertice: "+tutorVertice)
//@ts-ignore
result.graph[slotVertice][tutorVertice] = {
flow: 0,
capacity: defaultCapacity,
from: slotVertice,
type: "slot-to-tutor",
to: tutorVertice,
};
}
// Add edges from tutors to sink
for (const tutor of tutors) {
//@ts-ignore
let tutorVertice = result.nameToVertice[tutor];
//@ts-ignore
result.graph[tutorVertice] = result.graph[tutorVertice] || {};
let multiplier = 1;
let individualMultiplier = (_a = parsedJSON === null || parsedJSON === void 0 ? void 0 : parsedJSON.tutorMultipliers) === null || _a === void 0 ? void 0 : _a[tutor];
if (individualMultiplier !== undefined) {
multiplier = individualMultiplier;
}
let individualTutorCapacity = Math.floor(tutorCapacity * multiplier);
if (!!dictTutorToIndividualDiff) {
if (dictTutorToIndividualDiff[tutor] !== undefined) {
let individualDiff = dictTutorToIndividualDiff[tutor];
individualTutorCapacity += individualDiff;
}
}
//console.log("Adding edge from tutorVertice: "+tutorVertice+" to sink: "+sink)
//@ts-ignore
result.graph[tutorVertice][sink] = {
flow: 0,
capacity: individualTutorCapacity,
from: tutorVertice,
type: "tutor-to-sink",
to: sink,
};
}
//@ts-ignore
result.graph[sink] = result.graph[sink] || {};
//console.log("Amount groups: "+groupNames.length);
//console.log("Amount slots: "+slots.length);
//console.log("Amount tutors: "+tutors.length);
// console.log(JSON.stringify(result.graph, null, 2));
return result;
}
}
exports.default = JSONToGraph;