@@ -282,10 +282,9 @@ Constraint themeTrackConflict(ConstraintFactory factory) {
282282
283283 Constraint themeTrackRoomStability (ConstraintFactory factory ) {
284284 return factory .forEachUniquePair (Talk .class ,
285- equal (talk -> talk .getTimeslot ().getStartDateTime ().toLocalDate ()))
285+ equal (talk -> talk .getTimeslot ().getStartDateTime ().toLocalDate ()),
286+ filtering ((talk1 , talk2 ) -> !talk1 .getRoom ().equals (talk2 .getRoom ())))
286287 .expand ((talk1 , talk2 ) -> talk2 .overlappingThemeTrackCount (talk1 ))
287- .filter ((talk1 , talk2 , overlappingTrackCount ) -> overlappingTrackCount > 0
288- && !talk1 .getRoom ().equals (talk2 .getRoom ()))
289288 .penalize (HardSoftScore .ofSoft (10 ),
290289 (talk1 , talk2 , overlappingTrackCount ) -> overlappingTrackCount * talk1 .combinedDurationInMinutes (talk2 ))
291290 .asConstraint (THEME_TRACK_ROOM_STABILITY );
@@ -316,15 +315,17 @@ Constraint audienceTypeDiversity(ConstraintFactory factory) {
316315 Constraint audienceTypeThemeTrackConflict (ConstraintFactory factory ) {
317316 return factory .forEachUniquePair (Talk .class ,
318317 overlapping (t -> t .getTimeslot ().getStartDateTime (), t -> t .getTimeslot ().getEndDateTime ()))
319- .map ((talk1 , talk2 ) -> talk1 ,
320- (talk1 , talk2 ) -> talk2 ,
321- Talk ::overlappingThemeTrackCount ,
322- Talk ::overlappingAudienceTypeCount )
323- .filter ((talk1 , talk2 , overlappingTrackCount , overlappingTypeCount ) -> overlappingTrackCount > 0
324- && overlappingTypeCount > 0 )
318+ .expand ((talk1 , talk2 ) -> {
319+ var overlappingThemeTrackCount = talk2 .overlappingThemeTrackCount (talk1 );
320+ if (overlappingThemeTrackCount == 0 ) {
321+ return 0 ;
322+ }
323+ var overlappingAudienceTypeCount = talk2 .overlappingAudienceTypeCount (talk1 );
324+ return overlappingAudienceTypeCount * overlappingThemeTrackCount ;
325+ })
326+ .filter ((talk1 , talk2 , overlap ) -> overlap > 0 )
325327 .penalize (HardSoftScore .ofSoft (1 ),
326- (talk1 , talk2 , overlappingTrackCount , overlappingTypeCount ) -> overlappingTrackCount
327- * overlappingTypeCount * talk1 .overlappingDurationInMinutes (talk2 ))
328+ (talk1 , talk2 , overlap ) -> overlap * talk1 .overlappingDurationInMinutes (talk2 ))
328329 .asConstraint (AUDIENCE_TYPE_THEME_TRACK_CONFLICT );
329330 }
330331
@@ -372,16 +373,14 @@ Constraint languageDiversity(ConstraintFactory factory) {
372373 Constraint sameDayTalks (ConstraintFactory factory ) {
373374 return factory .forEachUniquePair (Talk .class )
374375 .filter ((talk1 , talk2 ) -> !talk1 .getTimeslot ().isOnSameDayAs (talk2 .getTimeslot ()))
375- .map ((talk1 , talk2 ) -> talk1 ,
376- (talk1 , talk2 ) -> talk2 ,
377- Talk :: overlappingContentCount ,
378- Talk :: overlappingThemeTrackCount )
379- . filter (( talk1 , talk2 , overlappingContentCount , overlappingThemeTrackCount ) -> overlappingContentCount > 0
380- || overlappingThemeTrackCount > 0 )
376+ .expand ((talk1 , talk2 ) -> {
377+ var overlappingContentCount = talk2 . overlappingContentCount (talk1 );
378+ var overlappingThemeTrackCount = talk2 . overlappingThemeTrackCount ( talk1 );
379+ return overlappingContentCount + overlappingThemeTrackCount ;
380+ })
381+ . filter (( talk1 , talk2 , overlap ) -> overlap > 0 )
381382 .penalize (HardSoftScore .ofSoft (10 ),
382- (talk1 , talk2 , overlappingContentCount ,
383- overlappingThemeTrackCount ) -> (overlappingContentCount + overlappingThemeTrackCount )
384- * talk1 .combinedDurationInMinutes (talk2 ))
383+ (talk1 , talk2 , overlap ) -> overlap * talk1 .combinedDurationInMinutes (talk2 ))
385384 .asConstraint (SAME_DAY_TALKS );
386385 }
387386
0 commit comments