@using Core.Calculation @using Microsoft.EntityFrameworkCore @page "/meeting-schedule" @inject IConfiguration Configuration @inject AppDbContext Context @Configuration["ChapterSettings:Shortname"] TSA Schedule @Configuration["ChapterSettings:CompetitionYear"] @Configuration["ChapterSettings:Shortname"] TSA Schedule @Configuration["ChapterSettings:CompetitionYear"] @* Include: @string.Join(", ", _requiredTeams) *@ Add High Effort Add Regionals Remove Individual Remove Low Effort @string.Join(", ", (_possibleAdditions ?? []).Select(e => e.ToString())) @foreach (var team in _teams.OrderBy(e => e.Event.Name)) { s.FirstName))">
@team.ToString()
}
Time Slots Solve Time slot: @context @{ var ol = TeamSchedulerSolution.GetStudentTeamOverlaps(context); } @foreach (var t in context) { @t.ToString() - @string.Join(", ", t.Students.Select(s => s.FirstName + " " + (ol.Any(o => o.Item1.Equals(s)) ? "*" : ""))) } @* @foreach (var overlap in ol) { @string.Join(", ", overlap.Item1) } *@ @{ var unscheduled = TeamSchedulerSolution.GetStudentsNotInTimSlot(context, _students); } @if (unscheduled.Any()) { Unscheduled foreach (var student in unscheduled) { @student.FirstName @string.Join(", ", _solution.StudentUnassignedTeams(student).Select(e => e.ToString())) } }
@code { private Team[]? _teams; private Student[]? _students; MudTable _solutionData; private TeamSchedulerSolution _solution; private TeamSchedulerOptions _parameters; bool _isSolving = false; private IEnumerable _requiredTeams = []; private Team[]? _possibleAdditions; //private Team[] _requiredTeams = []; private async Task OnSelectedValuesChanged(IEnumerable obj) { await _solutionData.ReloadServerData(); } private async Task AddRegionals() { _requiredTeams = _teams.Where(e => e.Event.RegionalEvent).Concat(_requiredTeams).Distinct(); } private async Task AddHighLevelOfEffort() { _requiredTeams = _teams.Where(e => e.Event.LevelOfEffort >= 3).Concat(_requiredTeams).Distinct(); } private async Task RemoveIndividual() { _requiredTeams = _requiredTeams.Where(t => t.Event.EventFormat != EventFormat.Individual); } private async Task RemoveLowLevelOfEffort() { _requiredTeams = _requiredTeams.Where(t => t.Event.LevelOfEffort > 1); } protected override async Task OnInitializedAsync() { _parameters = new TeamSchedulerOptions( timeSlots: 2, mustIncludeEvents: [ // "Medical Technology", "Electrical Applications" , "RegionalTeam", // ,"Dragster", "Flight" ], extended: [ // "Invention", "Construction Challenge", "Mechanical", "Mass", "Micro" //"STEM" //"Community", "Vlogging"// "Microcontroller" ], omittedEvents: [ // "Vlogging", "Junior", "Community Service Video", "Digital Photography", // "STEM" //"Leadership",// "Electrical", //"Construction" // "Forensic", //"CAD" //"I&I Team 1", "I&I Team 2"//, "Website Design", ], absentStudents: [ ] ); _teams = await Context.Teams .Include(e => e.Event) .Include(e => e.Students) .OrderBy(e => e.Event.Name) .ThenBy(e => e.Identifier) .ToArrayAsync(); _students = await Context.Students .Include(e => e.Teams) .ThenInclude(e => e.Captain) .Include(e => e.EventRankings) .ThenInclude(e => e.EventDefinition) .OrderBy(e => e.FirstName).ToArrayAsync(); } private async Task> SolveSchedule(TableState arg1, CancellationToken arg2) { _isSolving = true; var teamScheduler = new TeamScheduler(_requiredTeams, _parameters.TimeSlots); // teamScheduler // .ScheduleSeparate( // _teams.First(e => e.Event.Name.Contains("Data Science")), // _teams.First(e => e.Event.Name.Contains("Microcontroller Design")) // ); _solution = teamScheduler.Solve(); var loe = new UnassignedStudentScheduler(_teams, _solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.LevelOfEffort); var biggest = new UnassignedStudentScheduler(_teams, _solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.BiggestGroup); var individual = new UnassignedStudentScheduler(_teams, _solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.IndividualEvents); var anyNotMeetingAlready = new UnassignedStudentScheduler(_teams, _solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.AnyNotMeetingAlready); _possibleAdditions = loe; if (_possibleAdditions.Length == 0) _possibleAdditions = biggest; if (_possibleAdditions.Length == 0) _possibleAdditions = anyNotMeetingAlready; if (_possibleAdditions.Length == 0) _possibleAdditions = individual; await InvokeAsync(StateHasChanged); // let the UI know that the solution has been found _isSolving = false; return new TableData { Items = _solution.TimeSlots}; } private void Solve() { _solutionData.ReloadServerData(); } }