@@ -359,7 +359,17 @@ private Enrollment getEnrollment(Request request, Enrollment enrollment) {
359359 }
360360 sections .add (section );
361361 }
362- return cr .createEnrollment (currentSolution ().getAssignment (), sections );
362+ Enrollment ret = cr .createEnrollment (currentSolution ().getAssignment (), sections );
363+ if (enrollment .getReservation () != null ) {
364+ for (Reservation reservation : cr .getReservations (ret .getCourse ())) {
365+ if (reservation .getId () == enrollment .getReservation ().getId () && reservation .isIncluded (ret )) {
366+ ret .setReservation (reservation ); break ;
367+ }
368+ }
369+ } else {
370+ ret .setReservation (null );
371+ }
372+ return ret ;
363373 }
364374 }
365375
@@ -399,59 +409,78 @@ private void unassignAll() {
399409 public void execute () {
400410 iProgress = Progress .getInstance (currentSolution ().getModel ());
401411
402- Map <Long , Map <Long , Request >> requests = new Hashtable <Long , Map <Long ,Request >>();
403- for (Request request : currentSolution ().getModel ().variables ()) {
404- Map <Long , Request > r = requests .get (request .getStudent ().getId ());
405- if (r == null ) {
406- r = new Hashtable <Long , Request >();
407- requests .put (request .getStudent ().getId (), r );
408- }
409- r .put (request .getId (), request );
410- }
411-
412412 if (!iBestAssignmentTable .isEmpty ()) {
413- iProgress .setPhase ("Creating best assignment ..." , iBestAssignmentTable .size ());
413+ iProgress .setPhase ("Creating best assignment ..." , currentSolution (). getModel (). variables () .size ());
414414 unassignAll ();
415- for (Map .Entry <Long , Map <Long , Enrollment >> e1 : iBestAssignmentTable .entrySet ()) {
416- Map <Long , Request > r = requests .get (e1 .getKey ());
417- iProgress .incProgress ();
418- if (r == null ) continue ;
419- for (Map .Entry <Long , Enrollment > e2 : e1 .getValue ().entrySet ()) {
420- Request request = r .get (e2 .getKey ());
421- if (request == null ) continue ;
422- Enrollment enrollment = getEnrollment (request , e2 .getValue ());
423- if (enrollment !=null ) assign (enrollment , false );
424- }
415+
416+ List <Request > sortedRequests = new ArrayList <Request >(currentSolution ().getModel ().variables ());
417+ Collections .sort (sortedRequests , new Comparator <Request >() {
418+ @ Override
419+ public int compare (Request r1 , Request r2 ) {
420+ // Get best assignments
421+ Map <Long , Enrollment > a1 = iBestAssignmentTable .get (r1 .getStudent ().getId ());
422+ Enrollment e1 = (a1 == null ? null : a1 .get (r1 .getId ()));
423+ Map <Long , Enrollment > a2 = iBestAssignmentTable .get (r2 .getStudent ().getId ());
424+ Enrollment e2 = (a2 == null ? null : a2 .get (r2 .getId ()));
425+ // Enrollments with a reservation must go first, enrollments with an override go last
426+ // Not-assigned requests go last
427+ Integer o1 = (e1 == null ? 4 : e1 .getReservation () == null ? 2 : e1 .getReservation ().isExpired () ? 3 : 1 );
428+ Integer o2 = (e2 == null ? 4 : e2 .getReservation () == null ? 2 : e2 .getReservation ().isExpired () ? 3 : 1 );
429+ if (!o1 .equals (o2 )) return o1 .compareTo (o2 );
430+ // Then student and priority
431+ return r1 .compareTo (r2 );
432+ }
433+ });
434+ for (Request request : sortedRequests ) {
435+ iProgress .incProgress ();
436+ Map <Long , Enrollment > a = iBestAssignmentTable .get (request .getStudent ().getId ());
437+ Enrollment e = (a == null ? null : a .get (request .getId ()));
438+ if (e == null ) continue ;
439+ Enrollment enrollment = getEnrollment (request , e );
440+ if (enrollment !=null ) assign (enrollment , false );
425441 }
426442 currentSolution ().saveBest ();
427443 }
428444 if (!iInitialAssignmentTable .isEmpty ()) {
429- iProgress .setPhase ("Creating initial assignment ..." , iInitialAssignmentTable .size ());
430- for (Map .Entry <Long , Map <Long , Enrollment >> e1 : iInitialAssignmentTable .entrySet ()) {
431- Map <Long , Request > r = requests .get (e1 .getKey ());
432- iProgress .incProgress ();
433- if (r == null ) continue ;
434- for (Map .Entry <Long , Enrollment > e2 : e1 .getValue ().entrySet ()) {
435- Request request = r .get (e2 .getKey ());
436- if (request == null ) continue ;
437- Enrollment enrollment = getEnrollment (request , e2 .getValue ());
438- if (enrollment !=null ) request .setInitialAssignment (enrollment );
439- }
445+ iProgress .setPhase ("Creating initial assignment ..." , currentSolution ().getModel ().variables ().size ());
446+ for (Request request : currentSolution ().getModel ().variables ()) {
447+ iProgress .incProgress ();
448+ Map <Long , Enrollment > a = iInitialAssignmentTable .get (request .getStudent ().getId ());
449+ Enrollment e = (a == null ? null : a .get (request .getId ()));
450+ if (e == null ) continue ;
451+ Enrollment enrollment = getEnrollment (request , e );
452+ if (enrollment !=null ) request .setInitialAssignment (enrollment );
440453 }
441454 }
442455 if (!iCurrentAssignmentTable .isEmpty ()) {
443- iProgress .setPhase ("Creating current assignment ..." , iCurrentAssignmentTable .size ());
456+ iProgress .setPhase ("Creating current assignment ..." , currentSolution (). getModel (). variables () .size ());
444457 unassignAll ();
445- for (Map .Entry <Long , Map <Long , Enrollment >> e1 : iCurrentAssignmentTable .entrySet ()) {
446- Map <Long , Request > r = requests .get (e1 .getKey ());
447- iProgress .incProgress ();
448- if (r == null ) continue ;
449- for (Map .Entry <Long , Enrollment > e2 : e1 .getValue ().entrySet ()) {
450- Request request = r .get (e2 .getKey ());
451- if (request == null ) continue ;
452- Enrollment enrollment = getEnrollment (request , e2 .getValue ());
453- if (enrollment !=null ) assign (enrollment , true );
454- }
458+
459+ List <Request > sortedRequests = new ArrayList <Request >(currentSolution ().getModel ().variables ());
460+ Collections .sort (sortedRequests , new Comparator <Request >() {
461+ @ Override
462+ public int compare (Request r1 , Request r2 ) {
463+ // Get current assignments
464+ Map <Long , Enrollment > a1 = iCurrentAssignmentTable .get (r1 .getStudent ().getId ());
465+ Enrollment e1 = (a1 == null ? null : a1 .get (r1 .getId ()));
466+ Map <Long , Enrollment > a2 = iCurrentAssignmentTable .get (r2 .getStudent ().getId ());
467+ Enrollment e2 = (a2 == null ? null : a2 .get (r2 .getId ()));
468+ // Enrollments with a reservation must go first, enrollments with an override go last
469+ // Not-assigned requests go last
470+ Integer o1 = (e1 == null ? 4 : e1 .getReservation () == null ? 2 : e1 .getReservation ().isExpired () ? 3 : 1 );
471+ Integer o2 = (e2 == null ? 4 : e2 .getReservation () == null ? 2 : e2 .getReservation ().isExpired () ? 3 : 1 );
472+ if (!o1 .equals (o2 )) return o1 .compareTo (o2 );
473+ // Then student and priority
474+ return r1 .compareTo (r2 );
475+ }
476+ });
477+ for (Request request : sortedRequests ) {
478+ iProgress .incProgress ();
479+ Map <Long , Enrollment > a = iCurrentAssignmentTable .get (request .getStudent ().getId ());
480+ Enrollment e = (a == null ? null : a .get (request .getId ()));
481+ if (e == null ) continue ;
482+ Enrollment enrollment = getEnrollment (request , e );
483+ if (enrollment !=null ) assign (enrollment , true );
455484 }
456485 }
457486 iCurrentAssignmentTable .clear ();
0 commit comments