{-# LANGUAGE CPP, FlexibleContexts, UndecidableInstances #-}
module WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights(
TimetableCriteriaWeights(..),
associationList,
tag,
weightOfMaximiseComplianceWithFreePeriodPreferencesTag,
weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag,
weightOfMaximiseMeanStudentClassSizeTag,
weightOfMaximiseSynchronisationOfSynchronisedCoursesTag,
weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag,
weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag,
weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag,
weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag,
weightOfMinimiseDispersionOfTeacherWorkloadTag,
weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag,
weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag,
weightOfMinimiseMeanLocationChangesOfTeachersTag,
weightOfMinimiseMeanLocusOperandiOfTeachersTag,
weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag,
weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag,
weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag,
weightOfMinimiseRatioOfConsecutiveEqualLessonsTag,
weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag,
calculateWeightedMean,
zeroWeightOfMaximiseComplianceWithFreePeriodPreferences,
zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses,
zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,
zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay,
zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents,
zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers,
zeroWeightOfMinimiseMeanLocationChangesOfTeachers,
zeroWeightOfMinimiseMeanLocusOperandiOfTeachers,
zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,
zeroWeightOfMinimiseMeanStudentBodyCombinationsPerLesson,
zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons,
zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay
) where
import qualified Control.DeepSeq
import qualified Control.Monad.Writer
import qualified Data.Default
import qualified Text.XML.HXT.Arrow.Pickle as HXT
import qualified ToolShed.SelfValidate
import qualified WeekDaze.ExecutionConfiguration.Criterion as ExecutionConfiguration.Criterion
import qualified WeekDaze.ExecutionConfiguration.CriterionWeight as ExecutionConfiguration.CriterionWeight
#ifdef USE_HDBC
import qualified Database.HDBC
import qualified Data.Convertible
import qualified Data.Maybe
import qualified Data.Typeable
import qualified WeekDaze.Database.Selector as Database.Selector
instance (
Data.Convertible.Convertible Database.HDBC.SqlValue w,
Data.Typeable.Typeable w,
RealFrac w
) => Database.Selector.Selector (TimetableCriteriaWeights w) where
fromDatabase connection projectIdSql = let
tableName :: Database.Selector.TableName
tableName = Database.Selector.tablePrefix ++ tag
in do
criterionWeightRows <- map (
map $ Data.Maybe.fromMaybe Data.Default.def . either (
error . showString "WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights.fromDatabase:\tfailed to parse the value of a weight read from the database; " . show
) id . Database.HDBC.safeFromSql
) `fmap` Database.Selector.select connection (
map fst associationList
) [tableName] [(Database.Selector.projectIdColumnName, projectIdSql)]
return $ case criterionWeightRows of
[] -> Data.Default.def
[weightRow] -> case weightRow of
[
weightOfMaximiseComplianceWithFreePeriodPreferences,
weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,
weightOfMaximiseMeanStudentClassSize,
weightOfMaximiseSynchronisationOfSynchronisedCourses,
weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,
weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,
weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,
weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,
weightOfMinimiseDispersionOfTeacherWorkload,
weightOfMinimiseMeanInterCampusMigrationsOfStudents,
weightOfMinimiseMeanInterCampusMigrationsOfTeachers,
weightOfMinimiseMeanLocationChangesOfTeachers,
weightOfMinimiseMeanLocusOperandiOfTeachers,
weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,
weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,
weightOfMinimiseMeanStudentBodyCombinationsPerLesson,
weightOfMinimiseRatioOfConsecutiveEqualLessons,
weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay
] -> MkTimetableCriteriaWeights {
getWeightOfMaximiseComplianceWithFreePeriodPreferences = weightOfMaximiseComplianceWithFreePeriodPreferences,
getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity = weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,
getWeightOfMaximiseMeanStudentClassSize = weightOfMaximiseMeanStudentClassSize,
getWeightOfMaximiseSynchronisationOfSynchronisedCourses = weightOfMaximiseSynchronisationOfSynchronisedCourses,
getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio = weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,
getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest = weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,
getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay = weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,
getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay = weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,
getWeightOfMinimiseDispersionOfTeacherWorkload = weightOfMinimiseDispersionOfTeacherWorkload,
getWeightOfMinimiseMeanInterCampusMigrationsOfStudents = weightOfMinimiseMeanInterCampusMigrationsOfStudents,
getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers = weightOfMinimiseMeanInterCampusMigrationsOfTeachers,
getWeightOfMinimiseMeanLocationChangesOfTeachers = weightOfMinimiseMeanLocationChangesOfTeachers,
getWeightOfMinimiseMeanLocusOperandiOfTeachers = weightOfMinimiseMeanLocusOperandiOfTeachers,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge = weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge = weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,
getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson = weightOfMinimiseMeanStudentBodyCombinationsPerLesson,
getWeightOfMinimiseRatioOfConsecutiveEqualLessons = weightOfMinimiseRatioOfConsecutiveEqualLessons,
getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay = weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay
}
_ -> error $ "WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights.fromDatabase:\tunexpected number of columns=" ++ show (length weightRow) ++ " in row of table " ++ show tableName ++ "."
_ -> error $ "WeekDaze.ExecutionConfiguration.TimetableCriteriaWeights.fromDatabase:\tunexpected number of rows=" ++ show (length criterionWeightRows) ++ " selected from table " ++ show tableName ++ "."
#endif /* USE_HDBC */
tag :: String
tag = "timetableCriteriaWeights"
weightOfMaximiseComplianceWithFreePeriodPreferencesTag :: String
weightOfMaximiseComplianceWithFreePeriodPreferencesTag = "maximiseComplianceWithFreePeriodPreferences"
weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag :: String
weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag = "maximiseMeanRatioOfStudentClassSizeToLocationCapacity"
weightOfMaximiseMeanStudentClassSizeTag :: String
weightOfMaximiseMeanStudentClassSizeTag = "maximiseMeanStudentClassSize"
weightOfMaximiseSynchronisationOfSynchronisedCoursesTag :: String
weightOfMaximiseSynchronisationOfSynchronisedCoursesTag = "maximiseSynchronisationOfSynchronisedCourses"
weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag :: String
weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag = "maximiseWeightedMeanStudentBodyUtilisationRatio"
weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag :: String
weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag = "minimiseAverageAbsoluteDeviationFromIdealTimeslotRequest"
weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag :: String
weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag = "minimiseDispersionOfStudentFreePeriodsPerDay"
weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag :: String
weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag = "minimiseDispersionOfTeacherFreePeriodsPerDay"
weightOfMinimiseDispersionOfTeacherWorkloadTag :: String
weightOfMinimiseDispersionOfTeacherWorkloadTag = "minimiseDispersionOfTeacherWorkload"
weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag :: String
weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag = "minimiseMeanInterCampusMigrationsOfStudents"
weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag :: String
weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag = "minimiseMeanInterCampusMigrationsOfTeachers"
weightOfMinimiseMeanLocationChangesOfTeachersTag :: String
weightOfMinimiseMeanLocationChangesOfTeachersTag = "minimiseMeanLocationChangesOfTeachers"
weightOfMinimiseMeanLocusOperandiOfTeachersTag :: String
weightOfMinimiseMeanLocusOperandiOfTeachersTag = "minimiseMeanLocusOperandiOfTeachers"
weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag :: String
weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag = "minimiseMeanRatioOfIncompletelyBookedCoreKnowledge"
weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag :: String
weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag = "minimiseMeanRatioOfIncompletelyBookedOptionalKnowledge"
weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag :: String
weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag = "minimiseMeanStudentBodyCombinationsPerLesson"
weightOfMinimiseRatioOfConsecutiveEqualLessonsTag :: String
weightOfMinimiseRatioOfConsecutiveEqualLessonsTag = "minimiseRatioOfConsecutiveEqualLessons"
weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag :: String
weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag = "minimiseRatioOfSeparatedEqualLessonsWithinAnyDay"
associationList :: [(String, TimetableCriteriaWeights w -> ExecutionConfiguration.CriterionWeight.CriterionWeight w)]
associationList = [
(weightOfMaximiseComplianceWithFreePeriodPreferencesTag, getWeightOfMaximiseComplianceWithFreePeriodPreferences),
(weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag, getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity),
(weightOfMaximiseMeanStudentClassSizeTag, getWeightOfMaximiseMeanStudentClassSize),
(weightOfMaximiseSynchronisationOfSynchronisedCoursesTag, getWeightOfMaximiseSynchronisationOfSynchronisedCourses),
(weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag, getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio),
(weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag, getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest),
(weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag, getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay),
(weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag, getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay),
(weightOfMinimiseDispersionOfTeacherWorkloadTag, getWeightOfMinimiseDispersionOfTeacherWorkload),
(weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag, getWeightOfMinimiseMeanInterCampusMigrationsOfStudents),
(weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag, getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers),
(weightOfMinimiseMeanLocationChangesOfTeachersTag, getWeightOfMinimiseMeanLocationChangesOfTeachers),
(weightOfMinimiseMeanLocusOperandiOfTeachersTag, getWeightOfMinimiseMeanLocusOperandiOfTeachers),
(weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag, getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge),
(weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag, getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge),
(weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag, getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson),
(weightOfMinimiseRatioOfConsecutiveEqualLessonsTag, getWeightOfMinimiseRatioOfConsecutiveEqualLessons),
(weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag, getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay)
]
data TimetableCriteriaWeights w = MkTimetableCriteriaWeights {
getWeightOfMaximiseComplianceWithFreePeriodPreferences :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMaximiseMeanStudentClassSize :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMaximiseSynchronisationOfSynchronisedCourses :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseDispersionOfTeacherWorkload :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanInterCampusMigrationsOfStudents :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanLocationChangesOfTeachers :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanLocusOperandiOfTeachers :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseRatioOfConsecutiveEqualLessons :: ExecutionConfiguration.CriterionWeight.CriterionWeight w,
getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay :: ExecutionConfiguration.CriterionWeight.CriterionWeight w
} deriving (Eq, Show)
instance (Eq w, Num w) => ToolShed.SelfValidate.SelfValidator (TimetableCriteriaWeights w) where
getErrors timetableCriteriaWeights = ToolShed.SelfValidate.extractErrors [
(
ExecutionConfiguration.CriterionWeight.areAllZero timetableCriteriaWeights,
"The weight of @ least one timetable-criterion must be non-zero"
)
]
instance Num w => Data.Default.Default (TimetableCriteriaWeights w) where
def = MkTimetableCriteriaWeights {
getWeightOfMaximiseComplianceWithFreePeriodPreferences = Data.Default.def,
getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity = Data.Default.def,
getWeightOfMaximiseMeanStudentClassSize = Data.Default.def,
getWeightOfMaximiseSynchronisationOfSynchronisedCourses = Data.Default.def,
getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio = Data.Default.def,
getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest = Data.Default.def,
getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay = Data.Default.def,
getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay = Data.Default.def,
getWeightOfMinimiseDispersionOfTeacherWorkload = Data.Default.def,
getWeightOfMinimiseMeanInterCampusMigrationsOfStudents = Data.Default.def,
getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers = Data.Default.def,
getWeightOfMinimiseMeanLocationChangesOfTeachers = Data.Default.def,
getWeightOfMinimiseMeanLocusOperandiOfTeachers = Data.Default.def,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge = Data.Default.def,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge = Data.Default.def,
getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson = Data.Default.def,
getWeightOfMinimiseRatioOfConsecutiveEqualLessons = Data.Default.def,
getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay = Data.Default.def
}
instance (HXT.XmlPickler w, Ord w, Real w) => HXT.XmlPickler (TimetableCriteriaWeights w) where
xpickle = HXT.xpDefault Data.Default.def . HXT.xpElem tag $ HXT.xpWrap (
\(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) -> MkTimetableCriteriaWeights a b c d e f g h i j k l m n o p q r,
\MkTimetableCriteriaWeights {
getWeightOfMaximiseComplianceWithFreePeriodPreferences = weightOfMaximiseComplianceWithFreePeriodPreferences,
getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity = weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,
getWeightOfMaximiseMeanStudentClassSize = weightOfMaximiseMeanStudentClassSize,
getWeightOfMaximiseSynchronisationOfSynchronisedCourses = weightOfMaximiseSynchronisationOfSynchronisedCourses,
getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio = weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,
getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest = weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,
getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay = weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,
getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay = weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,
getWeightOfMinimiseDispersionOfTeacherWorkload = weightOfMinimiseDispersionOfTeacherWorkload,
getWeightOfMinimiseMeanInterCampusMigrationsOfStudents = weightOfMinimiseMeanInterCampusMigrationsOfStudents,
getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers = weightOfMinimiseMeanInterCampusMigrationsOfTeachers,
getWeightOfMinimiseMeanLocationChangesOfTeachers = weightOfMinimiseMeanLocationChangesOfTeachers,
getWeightOfMinimiseMeanLocusOperandiOfTeachers = weightOfMinimiseMeanLocusOperandiOfTeachers,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge = weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge = weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,
getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson = weightOfMinimiseMeanStudentBodyCombinationsPerLesson,
getWeightOfMinimiseRatioOfConsecutiveEqualLessons = weightOfMinimiseRatioOfConsecutiveEqualLessons,
getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay = weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay
} -> (
weightOfMaximiseComplianceWithFreePeriodPreferences,
weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,
weightOfMaximiseMeanStudentClassSize,
weightOfMaximiseSynchronisationOfSynchronisedCourses,
weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,
weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,
weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,
weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,
weightOfMinimiseDispersionOfTeacherWorkload,
weightOfMinimiseMeanInterCampusMigrationsOfStudents,
weightOfMinimiseMeanInterCampusMigrationsOfTeachers,
weightOfMinimiseMeanLocationChangesOfTeachers,
weightOfMinimiseMeanLocusOperandiOfTeachers,
weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,
weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,
weightOfMinimiseMeanStudentBodyCombinationsPerLesson,
weightOfMinimiseRatioOfConsecutiveEqualLessons,
weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay
)
) $ HXT.xp18Tuple (
xpickle' weightOfMaximiseComplianceWithFreePeriodPreferencesTag
) (
xpickle' weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacityTag
) (
xpickle' weightOfMaximiseMeanStudentClassSizeTag
) (
xpickle' weightOfMaximiseSynchronisationOfSynchronisedCoursesTag
) (
xpickle' weightOfMaximiseWeightedMeanStudentBodyUtilisationRatioTag
) (
xpickle' weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequestTag
) (
xpickle' weightOfMinimiseDispersionOfStudentFreePeriodsPerDayTag
) (
xpickle' weightOfMinimiseDispersionOfTeacherFreePeriodsPerDayTag
) (
xpickle' weightOfMinimiseDispersionOfTeacherWorkloadTag
) (
xpickle' weightOfMinimiseMeanInterCampusMigrationsOfStudentsTag
) (
xpickle' weightOfMinimiseMeanInterCampusMigrationsOfTeachersTag
) (
xpickle' weightOfMinimiseMeanLocationChangesOfTeachersTag
) (
xpickle' weightOfMinimiseMeanLocusOperandiOfTeachersTag
) (
xpickle' weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledgeTag
) (
xpickle' weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledgeTag
) (
xpickle' weightOfMinimiseMeanStudentBodyCombinationsPerLessonTag
) (
xpickle' weightOfMinimiseRatioOfConsecutiveEqualLessonsTag
) (
xpickle' weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDayTag
) where
xpickle' = HXT.xpDefault Data.Default.def . (`HXT.xpAttr` HXT.xpickle)
instance (Eq criterionWeight, Num criterionWeight) => ExecutionConfiguration.CriterionWeight.CriterionWeights (TimetableCriteriaWeights criterionWeight) where
areAllZero timetableCriteriaWeights = ExecutionConfiguration.CriterionWeight.areAllZero $ map (($ timetableCriteriaWeights) . snd) associationList
instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (TimetableCriteriaWeights criterionWeight) where
rnf (MkTimetableCriteriaWeights x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17) = Control.DeepSeq.rnf [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17]
calculateWeightedMean :: (
Fractional weightedMean,
Real criterionValue,
Real criterionWeight
)
=> TimetableCriteriaWeights criterionWeight
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> ExecutionConfiguration.Criterion.Criterion criterionValue
-> Control.Monad.Writer.Writer [Maybe criterionValue] weightedMean
calculateWeightedMean MkTimetableCriteriaWeights {
getWeightOfMaximiseComplianceWithFreePeriodPreferences = weightOfMaximiseComplianceWithFreePeriodPreferences,
getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity = weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity,
getWeightOfMaximiseMeanStudentClassSize = weightOfMaximiseMeanStudentClassSize,
getWeightOfMaximiseSynchronisationOfSynchronisedCourses = weightOfMaximiseSynchronisationOfSynchronisedCourses,
getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio = weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio,
getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest = weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest,
getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay = weightOfMinimiseDispersionOfStudentFreePeriodsPerDay,
getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay = weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay,
getWeightOfMinimiseDispersionOfTeacherWorkload = weightOfMinimiseDispersionOfTeacherWorkload,
getWeightOfMinimiseMeanInterCampusMigrationsOfStudents = weightOfMinimiseMeanInterCampusMigrationsOfStudents,
getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers = weightOfMinimiseMeanInterCampusMigrationsOfTeachers,
getWeightOfMinimiseMeanLocationChangesOfTeachers = weightOfMinimiseMeanLocationChangesOfTeachers,
getWeightOfMinimiseMeanLocusOperandiOfTeachers = weightOfMinimiseMeanLocusOperandiOfTeachers,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge = weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge,
getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge = weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge,
getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson = weightOfMinimiseMeanStudentBodyCombinationsPerLesson,
getWeightOfMinimiseRatioOfConsecutiveEqualLessons = weightOfMinimiseRatioOfConsecutiveEqualLessons,
getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay = weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay
} complianceWithFreePeriodPreferences meanRatioOfStudentClassSizeToLocationCapacity meanStudentClassSize synchronisationOfSynchronisedCourses weightedMeanStudentBodyUtilisationRatio averageAbsoluteDeviationFromIdealTimeslotRequest dispersionOfStudentFreePeriodsPerDay dispersionOfTeacherFreePeriodsPerDay dispersionOfTeacherWorkload meanInterCampusMigrationsOfStudents meanInterCampusMigrationsOfTeachers meanLocationChangesOfTeachers meanLocusOperandiOfTeachers meanRatioOfIncompletelyBookedCoreKnowledge meanRatioOfIncompletelyBookedOptionalKnowledge meanStudentBodyCombinationsPerLesson ratioOfConsecutiveEqualLessons ratioOfSeparatedEqualLessonsWithinAnyDay = ExecutionConfiguration.Criterion.calculateWeightedMean [
(complianceWithFreePeriodPreferences, weightOfMaximiseComplianceWithFreePeriodPreferences),
(meanRatioOfStudentClassSizeToLocationCapacity, weightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity),
(meanStudentClassSize, weightOfMaximiseMeanStudentClassSize),
(synchronisationOfSynchronisedCourses, weightOfMaximiseSynchronisationOfSynchronisedCourses),
(weightedMeanStudentBodyUtilisationRatio, weightOfMaximiseWeightedMeanStudentBodyUtilisationRatio),
(averageAbsoluteDeviationFromIdealTimeslotRequest, weightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest),
(dispersionOfStudentFreePeriodsPerDay, weightOfMinimiseDispersionOfStudentFreePeriodsPerDay),
(dispersionOfTeacherFreePeriodsPerDay, weightOfMinimiseDispersionOfTeacherFreePeriodsPerDay),
(dispersionOfTeacherWorkload, weightOfMinimiseDispersionOfTeacherWorkload),
(meanInterCampusMigrationsOfStudents, weightOfMinimiseMeanInterCampusMigrationsOfStudents),
(meanInterCampusMigrationsOfTeachers, weightOfMinimiseMeanInterCampusMigrationsOfTeachers),
(meanLocationChangesOfTeachers, weightOfMinimiseMeanLocationChangesOfTeachers),
(meanLocusOperandiOfTeachers, weightOfMinimiseMeanLocusOperandiOfTeachers),
(meanRatioOfIncompletelyBookedCoreKnowledge, weightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge),
(meanRatioOfIncompletelyBookedOptionalKnowledge, weightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge),
(meanStudentBodyCombinationsPerLesson, weightOfMinimiseMeanStudentBodyCombinationsPerLesson),
(ratioOfConsecutiveEqualLessons, weightOfMinimiseRatioOfConsecutiveEqualLessons),
(ratioOfSeparatedEqualLessonsWithinAnyDay, weightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay)
]
type Mutator w = TimetableCriteriaWeights w -> TimetableCriteriaWeights w
zeroWeightOfMaximiseComplianceWithFreePeriodPreferences :: Num w => Mutator w
zeroWeightOfMaximiseComplianceWithFreePeriodPreferences lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMaximiseComplianceWithFreePeriodPreferences = minBound
}
zeroWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity :: Num w => Mutator w
zeroWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMaximiseMeanRatioOfStudentClassSizeToLocationCapacity = minBound
}
zeroWeightOfMaximiseMeanStudentClassSize :: Num w => Mutator w
zeroWeightOfMaximiseMeanStudentClassSize lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMaximiseMeanStudentClassSize = minBound
}
zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses :: Num w => Mutator w
zeroWeightOfMaximiseSynchronisationOfSynchronisedCourses lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMaximiseSynchronisationOfSynchronisedCourses = minBound
}
zeroWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio :: Num w => Mutator w
zeroWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMaximiseWeightedMeanStudentBodyUtilisationRatio = minBound
}
zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest :: Num w => Mutator w
zeroWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseAverageAbsoluteDeviationFromIdealTimeslotRequest = minBound
}
zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay :: Num w => Mutator w
zeroWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseDispersionOfStudentFreePeriodsPerDay = minBound
}
zeroWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay :: Num w => Mutator w
zeroWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseDispersionOfTeacherFreePeriodsPerDay = minBound
}
zeroWeightOfMinimiseDispersionOfTeacherWorkload :: Num w => Mutator w
zeroWeightOfMinimiseDispersionOfTeacherWorkload lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseDispersionOfTeacherWorkload = minBound
}
zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents :: Num w => Mutator w
zeroWeightOfMinimiseMeanInterCampusMigrationsOfStudents lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanInterCampusMigrationsOfStudents = minBound
}
zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers :: Num w => Mutator w
zeroWeightOfMinimiseMeanInterCampusMigrationsOfTeachers lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanInterCampusMigrationsOfTeachers = minBound
}
zeroWeightOfMinimiseMeanLocationChangesOfTeachers :: Num w => Mutator w
zeroWeightOfMinimiseMeanLocationChangesOfTeachers lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanLocationChangesOfTeachers = minBound
}
zeroWeightOfMinimiseMeanLocusOperandiOfTeachers :: Num w => Mutator w
zeroWeightOfMinimiseMeanLocusOperandiOfTeachers lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanLocusOperandiOfTeachers = minBound
}
zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge :: Num w => Mutator w
zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanRatioOfIncompletelyBookedCoreKnowledge = minBound
}
zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge :: Num w => Mutator w
zeroWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanRatioOfIncompletelyBookedOptionalKnowledge = minBound
}
zeroWeightOfMinimiseMeanStudentBodyCombinationsPerLesson :: Num w => Mutator w
zeroWeightOfMinimiseMeanStudentBodyCombinationsPerLesson lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseMeanStudentBodyCombinationsPerLesson = minBound
}
zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons :: Num w => Mutator w
zeroWeightOfMinimiseRatioOfConsecutiveEqualLessons lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseRatioOfConsecutiveEqualLessons = minBound
}
zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay :: Num w => Mutator w
zeroWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay lessonCriteriaWeights = lessonCriteriaWeights {
getWeightOfMinimiseRatioOfSeparatedEqualLessonsWithinAnyDay = minBound
}