1 /*
2 File rules.h
3 */
4 
5 /***************************************************************************
6                           rules.h  -  description
7                              -------------------
8     begin                : 2003
9     copyright            : (C) 2003 by Lalescu Liviu
10     email                : Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)
11  ***************************************************************************/
12 
13 /***************************************************************************
14  *                                                                         *
15  *   This program is free software: you can redistribute it and/or modify  *
16  *   it under the terms of the GNU Affero General Public License as        *
17  *   published by the Free Software Foundation, either version 3 of the    *
18  *   License, or (at your option) any later version.                       *
19  *                                                                         *
20  ***************************************************************************/
21 
22 #ifndef RULES_H
23 #define RULES_H
24 
25 #include "timetable_defs.h"
26 #include "timeconstraint.h"
27 #include "spaceconstraint.h"
28 #include "activity.h"
29 #include "studentsset.h"
30 #include "teacher.h"
31 #include "subject.h"
32 #include "activitytag.h"
33 #include "room.h"
34 #include "building.h"
35 
36 #include "matrix.h"
37 
38 #include <QHash>
39 #include <QSet>
40 #include <QList>
41 #include <QStringList>
42 #include <QString>
43 
44 #include <QCoreApplication>
45 
46 class QXmlStreamReader;
47 
48 class QWidget;
49 
50 const int OFFICIAL=0;
51 const int MORNINGS_AFTERNOONS=1;
52 const int BLOCK_PLANNING=2;
53 const int TERMS=3;
54 
55 class FakeString
56 /*
57 fake string, so that the output log is not too large
58 */
59 {
60 public:
61 	FakeString();
62 
63 	void operator=(const QString& other);
64 	void operator=(const char* str);
65 	void operator+=(const QString& other);
66 	void operator+=(const char* str);
67 };
68 
69 /**
70 This class contains all the information regarding
71 the institution: teachers, students, activities, constraints, etc.
72 */
73 class Rules{
74 	Q_DECLARE_TR_FUNCTIONS(Rules)
75 
76 public:
77 	int mode;
78 
79 	bool modified;
80 
81 	/**
82 	The name of the institution
83 	*/
84 	QString institutionName;
85 
86 	/**
87 	The comments
88 	*/
89 	QString comments;
90 
91 	/**
92 	The number of days per week
93 	*/
94 	int nDaysPerWeek;
95 
96 	/**
97 	The number of hours per day
98 	*/
99 	int nHoursPerDay;
100 
101 	/**
102 	The days of the week (names)
103 	*/
104 	//QString daysOfTheWeek[MAX_DAYS_PER_WEEK];
105 	QStringList daysOfTheWeek;
106 
107 	/**
108 	The hours of the day (names).
109 	*/
110 	//QString hoursOfTheDay[MAX_HOURS_PER_DAY];
111 	QStringList hoursOfTheDay;
112 
113 	/**
114 	The number of hours per week
115 	*/
116 	int nHoursPerWeek;
117 
118 	int nTerms; //for terms (Finland) mode
119 
120 	int nDaysPerTerm; //for terms (Finland) mode
121 
122 	/**
123 	The list of teachers
124 	*/
125 	TeachersList teachersList;
126 
127 	/**
128 	The list of subjects
129 	*/
130 	SubjectsList subjectsList;
131 
132 	/**
133 	The list of activity tags
134 	*/
135 	ActivityTagsList activityTagsList;
136 
137 	/**
138 	The list of students (groups and subgroups included).
139 	Remember that every identifier (year, group or subgroup) must be UNIQUE.
140 	*/
141 	StudentsYearsList yearsList;
142 
143 	/**
144 	The list of activities
145 	*/
146 	ActivitiesList activitiesList;
147 
148 	/**
149 	The list of rooms
150 	*/
151 	RoomsList roomsList;
152 
153 	/**
154 	The list of buildings
155 	*/
156 	BuildingsList buildingsList;
157 
158 	/**
159 	The list of time constraints
160 	*/
161 	TimeConstraintsList timeConstraintsList;
162 
163 	/**
164 	The list of space constraints
165 	*/
166 	SpaceConstraintsList spaceConstraintsList;
167 
168 	GroupActivitiesInInitialOrderList groupActivitiesInInitialOrderList;
169 
170 	//For faster operation
171 	//not internal, but based on activity id / teacher name / students set name and constraints list
172 	QHash<int, Activity*> activitiesPointerHash; //first is the id, second is the pointer to the activity in Rules::activitiesList
173 	QSet<ConstraintBasicCompulsoryTime*> bctSet;
174 	QSet<ConstraintBreakTimes*> btSet;
175 	QSet<ConstraintBasicCompulsorySpace*> bcsSet;
176 	QHash<int, QSet<ConstraintActivityPreferredStartingTime*>> apstHash;
177 	QHash<int, QSet<ConstraintActivityPreferredRoom*>> aprHash;
178 	QHash<int, QSet<ConstraintMinDaysBetweenActivities*>> mdbaHash;
179 	QHash<QString, QSet<ConstraintTeacherNotAvailableTimes*>> tnatHash;
180 	QHash<QString, QSet<ConstraintStudentsSetNotAvailableTimes*>> ssnatHash;
181 
182 	//not internal
183 	QHash<QString, StudentsSet*> permanentStudentsHash;
184 
185 	//internal
186 	QHash<QString, int> teachersHash;
187 	QHash<QString, int> subjectsHash;
188 	QHash<QString, int> activityTagsHash;
189 	QHash<QString, StudentsSet*> studentsHash;
190 	QHash<QString, int> buildingsHash;
191 	QHash<QString, int> roomsHash;
192 	QHash<int, int> activitiesHash; //first is id, second is index in internal list
193 	//using activity index in internal activities
194 	/*QHash<QString, QSet<int>> activitiesForTeacherHash;
195 	QHash<QString, QSet<int>> activitiesForSubjectHash;
196 	QHash<QString, QSet<int>> activitiesForActivityTagHash;
197 	QHash<QString, QSet<int>> activitiesForStudentsSetHash;*/
198 
199 	/*
200 	The following variables contain redundant data and are used internally
201 	*/
202 	////////////////////////////////////////////////////////////////////////
203 	int nInternalTeachers;
204 	Matrix1D<Teacher*> internalTeachersList;
205 
206 	int nInternalSubjects;
207 	Matrix1D<Subject*> internalSubjectsList;
208 
209 	int nInternalActivityTags;
210 	Matrix1D<ActivityTag*> internalActivityTagsList;
211 
212 	int nInternalSubgroups;
213 	Matrix1D<StudentsSubgroup*> internalSubgroupsList;
214 
215 	StudentsGroupsList internalGroupsList;
216 
217 	StudentsYearsList augmentedYearsList;
218 
219 	/**
220 	Here will be only the active activities.
221 
222 	For speed, I used here not pointers, but static copies. (old comment.)
223 	*/
224 	int nInternalActivities;
225 	Matrix1D<Activity> internalActivitiesList;
226 
227 	QSet<int> inactiveActivities;
228 
229 	Matrix1D<QList<int>> activitiesForSubjectList;
230 	Matrix1D<QSet<int>> activitiesForSubjectSet;
231 	Matrix1D<QList<int>> activitiesForActivityTagList;
232 	Matrix1D<QSet<int>> activitiesForActivityTagSet;
233 
234 	int nInternalRooms;
235 	Matrix1D<Room*> internalRoomsList;
236 
237 	int nInternalBuildings;
238 	Matrix1D<Building*> internalBuildingsList;
239 
240 	int nInternalTimeConstraints;
241 	Matrix1D<TimeConstraint*> internalTimeConstraintsList;
242 
243 	int nInternalSpaceConstraints;
244 	Matrix1D<SpaceConstraint*> internalSpaceConstraintsList;
245 
246 	/*
247 	///////////////////////////////////////////////////////////////////////
248 	*/
249 
250 	/**
251 	True if the rules have been initialized in some way (new or loaded).
252 	*/
253 	bool initialized;
254 
255 	/**
256 	True if the internal structure was computed.
257 	*/
258 	bool internalStructureComputed;
259 
260 	/**
261 	Initializes the rules (empty)
262 	*/
263 	void init();
264 
265 	/**
266 	Internal structure initializer.
267 	<p>
268 	After any modification of the activities or students or teachers
269 	or constraints, you need to call this subroutine
270 	*/
271 	bool computeInternalStructure(QWidget* parent);
272 
273 	/**
274 	Terminator - basically clears the memory for the constraints.
275 	*/
276 	void kill();
277 
278 	Rules();
279 
280 	~Rules();
281 
282 	void setMode(int newMode);
283 
284 	void setTerms(int numberOfTerms, int numberOfDaysPerTerm);
285 
286 	void setInstitutionName(const QString& newInstitutionName);
287 
288 	void setComments(const QString& newComments);
289 
290 	/**
291 	Adds a new teacher
292 	(if not already in the list).
293 	Returns false/true (unsuccessful/successful).
294 	*/
295 	bool addTeacher(Teacher* teacher);
296 
297 	/*when reading rules, faster*/
298 	bool addTeacherFast(Teacher* teacher);
299 
300 	/**
301 	Returns the index of this teacher in the teachersList,
302 	or -1 for inexistent teacher.
303 	*/
304 	int searchTeacher(const QString& teacherName);
305 
306 	/**
307 	Removes this teacher and all related activities and constraints.
308 	It returns false on failure. If successful, returns true.
309 	*/
310 	bool removeTeacher(const QString& teacherName);
311 
312 	/**
313 	Modifies (renames) this teacher and takes care of all related activities and constraints.
314 	Returns true on success, false on failure (if not found)
315 	*/
316 	bool modifyTeacher(const QString& initialTeacherName, const QString& finalTeacherName);
317 
318 	/**
319 	A function to sort the teachers alphabetically
320 	*/
321 	void sortTeachersAlphabetically();
322 
323 	/**
324 	Adds a new subject
325 	(if not already in the list).
326 	Returns false/true (unsuccessful/successful).
327 	*/
328 	bool addSubject(Subject* subject);
329 
330 	/*
331 	When reading rules, faster
332 	*/
333 	bool addSubjectFast(Subject* subject);
334 
335 	/**
336 	Returns the index of this subject in the subjectsList,
337 	or -1 if not found.
338 	*/
339 	int searchSubject(const QString& subjectName);
340 
341 	/**
342 	Removes this subject and all related activities and constraints.
343 	It returns false on failure.
344 	If successful, returns true.
345 	*/
346 	bool removeSubject(const QString& subjectName);
347 
348 	/**
349 	Modifies (renames) this subject and takes care of all related activities and constraints.
350 	Returns true on success, false on failure (if not found)
351 	*/
352 	bool modifySubject(const QString& initialSubjectName, const QString& finalSubjectName);
353 
354 	/**
355 	A function to sort the subjects alphabetically
356 	*/
357 	void sortSubjectsAlphabetically();
358 
359 	/**
360 	Adds a new activity tag to the list of activity tags
361 	(if not already in the list).
362 	Returns false/true (unsuccessful/successful).
363 	*/
364 	bool addActivityTag(ActivityTag* activityTag);
365 
366 	/*
367 	When reading rules, faster
368 	*/
369 	bool addActivityTagFast(ActivityTag* activityTag);
370 
371 	/**
372 	Returns the index of this activity tag in the activityTagsList,
373 	or -1 if not found.
374 	*/
375 	int searchActivityTag(const QString& activityTagName);
376 
377 	/**
378 	Removes this activity tag. In the list of activities, the activity tag will
379 	be removed from all activities which posess it.
380 	It returns false on failure.
381 	If successful, returns true.
382 	*/
383 	bool removeActivityTag(const QString& activityTagName);
384 
385 	/**
386 	Modifies (renames) this activity tag and takes care of all related activities.
387 	Returns true on success, false on failure (if not found)
388 	*/
389 	bool modifyActivityTag(const QString& initialActivityTagName, const QString& finalActivityTagName);
390 
391 	/**
392 	A function to sort the activity tags alphabetically
393 	*/
394 	void sortActivityTagsAlphabetically();
395 
396 	void computePermanentStudentsHash();
397 
398 	/**
399 	Returns a pointer to the structure containing this student set
400 	(year, group or subgroup) or nullptr.
401 	*/
402 	StudentsSet* searchStudentsSet(const QString& setName);
403 
404 	StudentsSet* searchAugmentedStudentsSet(const QString& setName);
405 
406 	/**
407 	True if the students sets contain one common subgroup.
408 	This function is used in constraints isRelatedToStudentsSet
409 	*/
410 	bool setsShareStudents(const QString& studentsSet1, const QString& studentsSet2);
411 
412 	//Internal
413 	bool augmentedSetsShareStudentsFaster(const QString& studentsSet1, const QString& studentsSet2);
414 
415 	/**
416 	Adds a new year of study to the academic structure
417 	*/
418 	bool addYear(StudentsYear* year);
419 
420 	/*
421 	When reading rules, faster
422 	*/
423 	bool addYearFast(StudentsYear* year);
424 
425 //	bool emptyYear(const QString& yearName);
426 	bool removeYear(const QString& yearName);
427 //	bool removeYear(const QString& yearName, bool removeAlsoThisYear);
428 
429 	bool removeYearPointerAfterSplit(StudentsYear* yearPointer);
430 
431 	/**
432 	Returns -1 if not found or the index of this year in the years list
433 	*/
434 	int searchYear(const QString& yearName);
435 
436 	int searchAugmentedYear(const QString& yearName);
437 
438 	/**
439 	Modifies this students set (name, number of students) and takes care of all related
440 	activities and constraints. Returns true on success, false on failure (if not found)
441 	*/
442 	bool modifyStudentsSet(const QString& initialStudentsSetName, const QString& finalStudentsSetName, int finalNumberOfStudents);
443 
444 	bool modifyStudentsSets(const QHash<QString, QString>& oldAndNewStudentsSetNames);
445 
446 	/**
447 	A function to sort the years alphabetically
448 	*/
449 	void sortYearsAlphabetically();
450 
451 	/**
452 	Adds a new group in a certain year of study to the academic structure
453 	*/
454 	bool addGroup(const QString& yearName, StudentsGroup* group);
455 
456 	/*
457 	When reading rules, faster
458 	*/
459 	bool addGroupFast(StudentsYear* year, StudentsGroup* group);
460 
461 	bool removeGroup(const QString& yearName, const QString& groupName);
462 
463 	//Remove this group from all the years in which it exists
464 	bool purgeGroup(const QString& groupName);
465 
466 	/**
467 	Returns -1 if not found or the index of this group in the groups list
468 	of this year.
469 	*/
470 	int searchGroup(const QString& yearName, const QString& groupName);
471 
472 	int searchAugmentedGroup(const QString& yearName, const QString& groupName);
473 
474 	/**
475 	A function to sort the groups of this year alphabetically
476 	*/
477 	void sortGroupsAlphabetically(const QString& yearName);
478 
479 	/**
480 	Adds a new subgroup to a certain group in a certain year of study to
481 	the academic structure
482 	*/
483 	bool addSubgroup(const QString& yearName, const QString& groupName, StudentsSubgroup* subgroup);
484 
485 	/*
486 	When reading rules, faster
487 	*/
488 	bool addSubgroupFast(StudentsYear* year, StudentsGroup* group, StudentsSubgroup* subgroup);
489 
490 	bool removeSubgroup(const QString& yearName, const QString& groupName, const QString& subgroupName);
491 
492 	//Remove this subgroup from all the groups in which it exists
493 	bool purgeSubgroup(const QString& subgroupName);
494 
495 	/**
496 	Returns -1 if not found or the index of the subgroup in the list of subgroups of this group
497 	*/
498 	int searchSubgroup(const QString& yearName, const QString& groupName, const QString& subgroupName);
499 
500 	int searchAugmentedSubgroup(const QString& yearName, const QString& groupName, const QString& subgroupName);
501 
502 	/**
503 	A function to sort the subgroups of this group alphabetically
504 	*/
505 	void sortSubgroupsAlphabetically(const QString& yearName, const QString& groupName);
506 
507 	/**
508 	Adds a new indivisible activity (not split) to the list of activities.
509 	(It can add a subactivity of a split activity)
510 	Returns true if successful or false if the maximum
511 	number of activities was reached.
512 	*/
513 	/*bool addSimpleActivity(
514 		QWidget* parent,
515 		int _id,
516 		int _activityGroupId,
517 		const QStringList& _teachersNames,
518 		const QString& _subjectName,
519 		const QStringList& _activityTagsNames,
520 		const QStringList& _studentsNames,
521 		int _duration,
522 		int _totalDuration,
523 		bool _active,
524 		bool _computeNTotalStudents,
525 		int _nTotalStudents);*/
526 
527 	/*
528 	Faster (no need to recompute the number of students in activity constructor)
529 	*/
530 	bool addSimpleActivityFast(
531 		QWidget* parent,
532 		int _id,
533 		int _activityGroupId,
534 		const QStringList& _teachersNames,
535 		const QString& _subjectName,
536 		const QStringList& _activityTagsNames,
537 		const QStringList& _studentsNames,
538 		int _duration,
539 		int _totalDuration,
540 		bool _active,
541 		bool _computeNTotalStudents,
542 		int _nTotalStudents,
543 		int _computedNumberOfStudents);
544 
545 	/**
546 	Adds a new split activity to the list of activities.
547 	Returns true if successful or false if the maximum
548 	number of activities was reached.
549 	If _minDayDistance>0, there will automatically added a compulsory
550 	ConstraintMinDaysBetweenActivities.
551 	*/
552 	/*bool addSplitActivity(
553 		QWidget* parent,
554 		int _firstActivityId,
555 		int _activityGroupId,
556 		const QStringList& _teachersNames,
557 		const QString& _subjectName,
558 		const QStringList& _activityTagsNames,
559 		const QStringList& _studentsNames,
560 		int _nSplits,
561 		int _totalDuration,
562 		int _durations[],
563 		bool _active[],
564 		int _minDayDistance,
565 		double _weightPercentage,
566 		bool _consecutiveIfSameDay,
567 		bool _computeNTotalStudents,
568 		int _nTotalStudents);*/
569 
570 	bool addSplitActivityFast(
571 		QWidget* parent,
572 		int _firstActivityId,
573 		int _activityGroupId,
574 		const QStringList& _teachersNames,
575 		const QString& _subjectName,
576 		const QStringList& _activityTagsNames,
577 		const QStringList& _studentsNames,
578 		int _nSplits,
579 		int _totalDuration,
580 		QList<int> _durations,
581 		QList<bool> _active,
582 		int _minDayDistance,
583 		double _weightPercentage,
584 		bool _consecutiveIfSameDay,
585 		bool _computeNTotalStudents,
586 		int _nTotalStudents,
587 		int _computedNumberOfStudents);
588 
589 	/**
590 	Removes only the activity with this id.
591 	*/
592 	//void removeActivity(int _id);
593 
594 	/**
595 	If _activityGroupId==0, then this is a non-split activity
596 	(if >0, then this is a single sub-activity from a split activity.
597 	Removes this activity from the list of activities.
598 	For split activities, it removes all the sub-activities that are contained in it.
599 	*/
600 	void removeActivity(int _id, int _activityGroupId);
601 
602 	void removeActivities(const QList<int>& _idsList, bool updateConstraints);
603 
604 	/**
605 	A function to modify the information of a certain activity.
606 	If this is a sub-activity of a split activity,
607 	all the sub-activities will be modified.
608 	*/
609 	void modifyActivity(
610 		int _id,
611 		int _activityGroupId,
612 		const QStringList& _teachersNames,
613 		const QString& _subjectName,
614 		const QStringList& _activityTagsNames,
615 		const QStringList& _studentsNames,
616 	 	int _nSplits,
617 		int _totalDuration,
618 		QList<int> _durations,
619 		QList<bool> _active,
620 		bool _computeNTotalStudents,
621 		int _nTotalStudents);
622 
623 	void modifySubactivity(
624 		int _id,
625 		int _activityGroupId,
626 		const QStringList& _teachersNames,
627 		const QString& _subjectName,
628 		const QStringList& _activityTagsNames,
629 		const QStringList& _studentsNames,
630 		int _duration,
631 		bool _active,
632 		bool _computeNTotalStudents,
633 		int _nTotalStudents);
634 
635 	/**
636 	Adds a new room (already allocated).
637 	Returns true on success, false for already existing rooms (same name).
638 	*/
639 	bool addRoom(Room* rm);
640 
641 	/*
642 	Faster, when reading
643 	*/
644 	bool addRoomFast(Room* rm);
645 
646 	/**
647 	Returns -1 if not found or the index in the rooms list if found.
648 	*/
649 	int searchRoom(const QString& roomName);
650 
651 	/**
652 	Removes the room with this name.
653 	Returns true on success, false on failure (not found).
654 	*/
655 	bool removeRoom(const QString& roomName);
656 
657 	/**
658 	Modifies this room and takes care of all related constraints.
659 	Returns true on success, false on failure (if not found)
660 	*/
661 	bool modifyRoom(const QString& initialRoomName, const QString& finalRoomName, const QString& building, int capacity);
662 
663 	/**
664 	A function to sort the room alphabetically, by name
665 	*/
666 	void sortRoomsAlphabetically();
667 
668 	/**
669 	Adds a new building (already allocated).
670 	Returns true on success, false for already existing buildings (same name).
671 	*/
672 	bool addBuilding(Building* rm);
673 
674 	/*
675 	Faster, when reading
676 	*/
677 	bool addBuildingFast(Building* rm);
678 
679 	/**
680 	Returns -1 if not found or the index in the buildings list if found.
681 	*/
682 	int searchBuilding(const QString& buildingName);
683 
684 	/**
685 	Removes the building with this name.
686 	Returns true on success, false on failure (not found).
687 	*/
688 	bool removeBuilding(const QString& buildingName);
689 
690 	/**
691 	Modifies this building and takes care of all related constraints.
692 	Returns true on success, false on failure (if not found)
693 	*/
694 	bool modifyBuilding(const QString& initialBuildingName, const QString& finalBuildingName);
695 
696 	/**
697 	A function to sort the buildings alphabetically, by name
698 	*/
699 	void sortBuildingsAlphabetically();
700 
701 	/**
702 	Adds a new time constraint (already allocated).
703 	Returns true on success, false for already existing constraints.
704 	*/
705 	bool addTimeConstraint(TimeConstraint* ctr);
706 
707 	/**
708 	Removes this time constraint.
709 	Returns true on success, false on failure (not found).
710 	*/
711 	bool removeTimeConstraint(TimeConstraint* ctr);
712 
713 	/**
714 	Adds a new space constraint (already allocated).
715 	Returns true on success, false for already existing constraints.
716 	*/
717 	bool addSpaceConstraint(SpaceConstraint* ctr);
718 
719 	/**
720 	Removes this space constraint.
721 	Returns true on success, false on failure (not found).
722 	*/
723 	bool removeSpaceConstraint(SpaceConstraint* ctr);
724 
725 	bool removeTimeConstraints(QList<TimeConstraint*> _tcl);
726 	bool removeSpaceConstraints(QList<SpaceConstraint*> _scl);
727 
728 	int xmlReaderNumberOfUnrecognizedFields;
729 
730 	QList<QString> unrecognizedXmlTags;
731 	QList<int> unrecognizedXmlLineNumbers;
732 	QList<int> unrecognizedXmlColumnNumbers;
733 
734 	/**
735 	Reads the rules from the xml input file "filename".
736 	Returns true on success, false on failure (inexistent file or wrong format)
737 	*/
738 	bool read(QWidget* parent, const QString& fileName, bool commandLine=false, QString commandLineDirectory=QString());
739 
740 	/**
741 	Write the rules to the xml input file "inputfile".
742 	*/
743 	bool write(QWidget* parent, const QString& filename);
744 
745 	int activateTeacher(const QString& teacherName);
746 
747 	int activateStudents(const QString& studentsName);
748 
749 	int activateSubject(const QString& subjectName);
750 
751 	int activateActivityTag(const QString& activityTagName);
752 
753 	int deactivateTeacher(const QString& teacherName);
754 
755 	int deactivateStudents(const QString& studentsName);
756 
757 	int deactivateSubject(const QString& subjectName);
758 
759 	int deactivateActivityTag(const QString& activityTagName);
760 
761 	void makeActivityTagPrintable(const QString& activityTagName);
762 	void makeActivityTagNotPrintable(const QString& activityTagName);
763 
764 	void updateActivitiesWhenRemovingStudents(const QSet<StudentsSet*>& studentsSets, bool updateConstraints);
765 	void updateGroupActivitiesInInitialOrderAfterRemoval();
766 	void updateConstraintsAfterRemoval();
767 
768 private:
769 	TimeConstraint* readBasicCompulsoryTime(QXmlStreamReader& xml, FakeString& xmlReadingLog);
770 	TimeConstraint* readTeacherNotAvailable(QXmlStreamReader& xml, FakeString& xmlReadingLog);
771 	TimeConstraint* readTeacherNotAvailableTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
772 	TimeConstraint* readTeacherMaxDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
773 
774 	TimeConstraint* readTeacherMaxThreeConsecutiveDays(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
775 	TimeConstraint* readTeachersMaxThreeConsecutiveDays(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
776 
777 	TimeConstraint* readTeachersMaxDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
778 
779 	TimeConstraint* readTeacherMinDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
780 	TimeConstraint* readTeachersMinDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
781 
782 	TimeConstraint* readTeacherIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
783 	TimeConstraint* readTeachersIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
784 	TimeConstraint* readStudentsSetMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
785 	TimeConstraint* readStudentsMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
786 	TimeConstraint* readStudentsSetIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
787 	TimeConstraint* readStudentsIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
788 	TimeConstraint* readStudentsSetNotAvailable(QXmlStreamReader& xml, FakeString& xmlReadingLog);
789 	TimeConstraint* readStudentsSetNotAvailableTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
790 	TimeConstraint* readMinNDaysBetweenActivities(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
791 	TimeConstraint* readMinDaysBetweenActivities(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
792 	TimeConstraint* readMaxDaysBetweenActivities(QXmlStreamReader& xml, FakeString& xmlReadingLog);
793 	TimeConstraint* readMinGapsBetweenActivities(QXmlStreamReader& xml, FakeString& xmlReadingLog);
794 	TimeConstraint* readMaxGapsBetweenActivities(QXmlStreamReader& xml, FakeString& xmlReadingLog);
795 	TimeConstraint* readActivitiesNotOverlapping(QXmlStreamReader& xml, FakeString& xmlReadingLog);
796 	TimeConstraint* readActivityTagsNotOverlapping(QXmlStreamReader& xml, FakeString& xmlReadingLog);
797 	TimeConstraint* readActivitiesSameStartingTime(QXmlStreamReader& xml, FakeString& xmlReadingLog);
798 	TimeConstraint* readActivitiesSameStartingHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
799 	TimeConstraint* readActivitiesSameStartingDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
800 	TimeConstraint* readTeachersMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
801 	TimeConstraint* readTeacherMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
802 	TimeConstraint* readTeachersMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
803 	TimeConstraint* readTeacherMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
804 	TimeConstraint* readTeacherActivityTagMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
805 	TimeConstraint* readTeachersActivityTagMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
806 
807 	TimeConstraint* readTeacherActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
808 	TimeConstraint* readTeachersActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
809 
810 	TimeConstraint* readTeacherActivityTagMinHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
811 	TimeConstraint* readTeachersActivityTagMinHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
812 
813 	TimeConstraint* readTeachersMinHoursDaily(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
814 	TimeConstraint* readTeacherMinHoursDaily(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
815 	TimeConstraint* readStudentsMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
816 	TimeConstraint* readStudentsSetMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
817 	TimeConstraint* readStudentsMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
818 	TimeConstraint* readStudentsSetMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
819 	TimeConstraint* readStudentsSetActivityTagMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
820 	TimeConstraint* readStudentsActivityTagMaxHoursContinuously(QXmlStreamReader& xml, FakeString& xmlReadingLog);
821 
822 	TimeConstraint* readStudentsSetActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
823 	TimeConstraint* readStudentsActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
824 
825 	TimeConstraint* readStudentsSetActivityTagMinHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
826 	TimeConstraint* readStudentsActivityTagMinHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
827 
828 	TimeConstraint* readStudentsMinHoursDaily(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
829 	TimeConstraint* readStudentsSetMinHoursDaily(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
830 
831 	TimeConstraint* readStudentsSetMinGapsBetweenOrderedPairOfActivityTags(QXmlStreamReader& xml, FakeString& xmlReadingLog);
832 	TimeConstraint* readStudentsMinGapsBetweenOrderedPairOfActivityTags(QXmlStreamReader& xml, FakeString& xmlReadingLog);
833 	TimeConstraint* readTeacherMinGapsBetweenOrderedPairOfActivityTags(QXmlStreamReader& xml, FakeString& xmlReadingLog);
834 	TimeConstraint* readTeachersMinGapsBetweenOrderedPairOfActivityTags(QXmlStreamReader& xml, FakeString& xmlReadingLog);
835 
836 	TimeConstraint* readActivityPreferredTime(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog,
837 		bool& reportUnspecifiedPermanentlyLockedTime, bool& reportUnspecifiedDayOrHourPreferredStartingTime);
838 	TimeConstraint* readActivityPreferredStartingTime(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog,
839 		bool& reportUnspecifiedPermanentlyLockedTime, bool& reportUnspecifiedDayOrHourPreferredStartingTime);
840 
841 	TimeConstraint* readActivityEndsStudentsDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
842 	TimeConstraint* readActivitiesEndStudentsDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
843 
844 	TimeConstraint* readActivityEndsTeachersDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
845 	TimeConstraint* readActivitiesEndTeachersDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
846 
847 	/*old, with 2 and 3*/
848 	TimeConstraint* read2ActivitiesConsecutive(QXmlStreamReader& xml, FakeString& xmlReadingLog);
849 	TimeConstraint* read2ActivitiesGrouped(QXmlStreamReader& xml, FakeString& xmlReadingLog);
850 	TimeConstraint* read3ActivitiesGrouped(QXmlStreamReader& xml, FakeString& xmlReadingLog);
851 	TimeConstraint* read2ActivitiesOrdered(QXmlStreamReader& xml, FakeString& xmlReadingLog);
852 	/*end old*/
853 
854 	TimeConstraint* readTwoActivitiesConsecutive(QXmlStreamReader& xml, FakeString& xmlReadingLog);
855 	TimeConstraint* readTwoActivitiesGrouped(QXmlStreamReader& xml, FakeString& xmlReadingLog);
856 	TimeConstraint* readThreeActivitiesGrouped(QXmlStreamReader& xml, FakeString& xmlReadingLog);
857 	TimeConstraint* readTwoActivitiesOrdered(QXmlStreamReader& xml, FakeString& xmlReadingLog);
858 	TimeConstraint* readTwoSetsOfActivitiesOrdered(QXmlStreamReader& xml, FakeString& xmlReadingLog);
859 	TimeConstraint* readTwoActivitiesOrderedIfSameDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
860 
861 	TimeConstraint* readActivityPreferredTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
862 	TimeConstraint* readActivityPreferredTimeSlots(QXmlStreamReader& xml, FakeString& xmlReadingLog);
863 	TimeConstraint* readActivityPreferredStartingTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
864 
865 	TimeConstraint* readBreak(QXmlStreamReader& xml, FakeString& xmlReadingLog);
866 	TimeConstraint* readBreakTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
867 
868 	TimeConstraint* readTeachersNoGaps(QXmlStreamReader& xml, FakeString& xmlReadingLog);
869 	TimeConstraint* readTeachersMaxGapsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
870 	TimeConstraint* readTeacherMaxGapsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
871 	TimeConstraint* readTeachersMaxGapsPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
872 	TimeConstraint* readTeacherMaxGapsPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
873 
874 	TimeConstraint* readTeachersMaxGapsPerMorningAndAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
875 	TimeConstraint* readTeacherMaxGapsPerMorningAndAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
876 
877 	TimeConstraint* readStudentsNoGaps(QXmlStreamReader& xml, FakeString& xmlReadingLog);
878 	TimeConstraint* readStudentsSetNoGaps(QXmlStreamReader& xml, FakeString& xmlReadingLog);
879 	TimeConstraint* readStudentsMaxGapsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
880 	TimeConstraint* readStudentsSetMaxGapsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
881 
882 	TimeConstraint* readStudentsMaxGapsPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
883 	TimeConstraint* readStudentsSetMaxGapsPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
884 
885 	TimeConstraint* readStudentsEarly(QXmlStreamReader& xml, FakeString& xmlReadingLog);
886 	TimeConstraint* readStudentsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
887 	TimeConstraint* readStudentsSetEarly(QXmlStreamReader& xml, FakeString& xmlReadingLog);
888 	TimeConstraint* readStudentsSetEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
889 
890 	TimeConstraint* readActivitiesPreferredTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
891 	TimeConstraint* readActivitiesPreferredTimeSlots(QXmlStreamReader& xml, FakeString& xmlReadingLog);
892 	TimeConstraint* readActivitiesPreferredStartingTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
893 
894 	TimeConstraint* readSubactivitiesPreferredTimeSlots(QXmlStreamReader& xml, FakeString& xmlReadingLog);
895 	TimeConstraint* readSubactivitiesPreferredStartingTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
896 
897 	TimeConstraint* readActivitiesOccupyMaxTimeSlotsFromSelection(QXmlStreamReader& xml, FakeString& xmlReadingLog);
898 	TimeConstraint* readActivitiesOccupyMinTimeSlotsFromSelection(QXmlStreamReader& xml, FakeString& xmlReadingLog);
899 	TimeConstraint* readActivitiesMaxSimultaneousInSelectedTimeSlots(QXmlStreamReader& xml, FakeString& xmlReadingLog);
900 	TimeConstraint* readActivitiesMinSimultaneousInSelectedTimeSlots(QXmlStreamReader& xml, FakeString& xmlReadingLog);
901 
902 	TimeConstraint* readMaxTotalActivitiesFromSetInSelectedTimeSlots(QXmlStreamReader& xml, FakeString& xmlReadingLog);
903 
904 	TimeConstraint* readActivitiesMaxInATerm(QXmlStreamReader& xml, FakeString& xmlReadingLog);
905 	TimeConstraint* readActivitiesOccupyMaxTerms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
906 
907 	TimeConstraint* readTeacherMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
908 	TimeConstraint* readTeachersMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
909 	TimeConstraint* readStudentsSetMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
910 	TimeConstraint* readStudentsMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
911 
912 	TimeConstraint* readTeacherMinRestingHours(QXmlStreamReader& xml, FakeString& xmlReadingLog);
913 	TimeConstraint* readTeachersMinRestingHours(QXmlStreamReader& xml, FakeString& xmlReadingLog);
914 	TimeConstraint* readStudentsSetMinRestingHours(QXmlStreamReader& xml, FakeString& xmlReadingLog);
915 	TimeConstraint* readStudentsMinRestingHours(QXmlStreamReader& xml, FakeString& xmlReadingLog);
916 
917 	//For mornings-afternoons
918 	TimeConstraint* readTeacherMaxRealDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
919 	TimeConstraint* readTeachersMaxRealDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
920 
921 	TimeConstraint* readTeacherMaxAfternoonsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
922 	TimeConstraint* readTeachersMaxAfternoonsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
923 	TimeConstraint* readTeacherMaxMorningsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
924 	TimeConstraint* readTeachersMaxMorningsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
925 
926 	TimeConstraint* readTeacherMaxTwoConsecutiveMornings(QXmlStreamReader& xml, FakeString& xmlReadingLog);
927 	TimeConstraint* readTeachersMaxTwoConsecutiveMornings(QXmlStreamReader& xml, FakeString& xmlReadingLog);
928 	TimeConstraint* readTeacherMaxTwoConsecutiveAfternoons(QXmlStreamReader& xml, FakeString& xmlReadingLog);
929 	TimeConstraint* readTeachersMaxTwoConsecutiveAfternoons(QXmlStreamReader& xml, FakeString& xmlReadingLog);
930 
931 	TimeConstraint* readTeacherMaxTwoActivityTagsPerDayFromN1N2N3(QXmlStreamReader& xml, FakeString& xmlReadingLog);
932 	TimeConstraint* readTeachersMaxTwoActivityTagsPerDayFromN1N2N3(QXmlStreamReader& xml, FakeString& xmlReadingLog);
933 
934 	TimeConstraint* readTeacherMinRealDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
935 	TimeConstraint* readTeachersMinRealDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
936 
937 	TimeConstraint* readTeacherMinMorningsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
938 	TimeConstraint* readTeachersMinMorningsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
939 	TimeConstraint* readTeacherMinAfternoonsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
940 	TimeConstraint* readTeachersMinAfternoonsPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
941 
942 	TimeConstraint* readTeacherMorningIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
943 	TimeConstraint* readTeachersMorningIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
944 
945 	TimeConstraint* readTeacherAfternoonIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
946 	TimeConstraint* readTeachersAfternoonIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
947 
948 	TimeConstraint* readStudentsSetMaxRealDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
949 	TimeConstraint* readStudentsMaxRealDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
950 
951 	TimeConstraint* readStudentsSetMaxAfternoonsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
952 	TimeConstraint* readStudentsMaxAfternoonsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
953 	TimeConstraint* readStudentsSetMaxMorningsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
954 	TimeConstraint* readStudentsMaxMorningsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
955 
956 	TimeConstraint* readStudentsSetMinAfternoonsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
957 	TimeConstraint* readStudentsMinAfternoonsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
958 	TimeConstraint* readStudentsSetMinMorningsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
959 	TimeConstraint* readStudentsMinMorningsPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
960 
961 	TimeConstraint* readStudentsSetMorningIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
962 	TimeConstraint* readStudentsMorningIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
963 	TimeConstraint* readStudentsSetAfternoonIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
964 	TimeConstraint* readStudentsAfternoonIntervalMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
965 
966 	TimeConstraint* readTeachersMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
967 	TimeConstraint* readTeacherMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
968 
969 	TimeConstraint* readTeacherActivityTagMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
970 	TimeConstraint* readTeachersActivityTagMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
971 
972 	TimeConstraint* readTeacherMaxHoursPerAllAfternoons(QXmlStreamReader& xml, FakeString& xmlReadingLog);
973 	TimeConstraint* readTeachersMaxHoursPerAllAfternoons(QXmlStreamReader& xml, FakeString& xmlReadingLog);
974 
975 	TimeConstraint* readStudentsSetMaxHoursPerAllAfternoons(QXmlStreamReader& xml, FakeString& xmlReadingLog);
976 	TimeConstraint* readStudentsMaxHoursPerAllAfternoons(QXmlStreamReader& xml, FakeString& xmlReadingLog);
977 
978 	TimeConstraint* readTeachersMinHoursPerMorning(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
979 	TimeConstraint* readTeacherMinHoursPerMorning(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
980 
981 	TimeConstraint* readTeachersMinHoursDailyRealDays(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
982 	TimeConstraint* readTeacherMinHoursDailyRealDays(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
983 
984 	TimeConstraint* readStudentsMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
985 	TimeConstraint* readStudentsSetMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
986 
987 	TimeConstraint* readStudentsSetActivityTagMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
988 	TimeConstraint* readStudentsActivityTagMaxHoursDailyRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
989 
990 	TimeConstraint* readStudentsMinHoursPerMorning(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
991 	TimeConstraint* readStudentsSetMinHoursPerMorning(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
992 
993 	TimeConstraint* readTeacherMaxZeroGapsPerAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
994 	TimeConstraint* readTeachersMaxZeroGapsPerAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
995 
996 	TimeConstraint* readTeachersMaxGapsPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
997 	TimeConstraint* readTeacherMaxGapsPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
998 
999 	TimeConstraint* readStudentsMaxGapsPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1000 	TimeConstraint* readStudentsSetMaxGapsPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1001 
1002 	TimeConstraint* readTeachersMaxGapsPerWeekForRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1003 	TimeConstraint* readTeacherMaxGapsPerWeekForRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1004 	TimeConstraint* readStudentsMaxGapsPerWeekForRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1005 	TimeConstraint* readStudentsSetMaxGapsPerWeekForRealDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1006 
1007 	TimeConstraint* readStudentsAfternoonsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1008 	TimeConstraint* readStudentsSetAfternoonsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1009 
1010 	TimeConstraint* readTeachersAfternoonsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1011 	TimeConstraint* readTeacherAfternoonsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1012 
1013 	TimeConstraint* readStudentsMorningsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1014 	TimeConstraint* readStudentsSetMorningsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1015 
1016 	TimeConstraint* readTeachersMorningsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1017 	TimeConstraint* readTeacherMorningsEarlyMaxBeginningsAtSecondHour(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1018 
1019 	TimeConstraint* readTeacherMaxSpanPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1020 	TimeConstraint* readTeachersMaxSpanPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1021 	TimeConstraint* readStudentsSetMaxSpanPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1022 	TimeConstraint* readStudentsMaxSpanPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1023 
1024 	TimeConstraint* readTeacherMinRestingHoursBetweenMorningAndAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1025 	TimeConstraint* readTeachersMinRestingHoursBetweenMorningAndAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1026 	TimeConstraint* readStudentsSetMinRestingHoursBetweenMorningAndAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1027 	TimeConstraint* readStudentsMinRestingHoursBetweenMorningAndAfternoon(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1028 
1029 	TimeConstraint* readOldMATeacherMaxDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1030 	TimeConstraint* readOldMATeachersMaxDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1031 	TimeConstraint* readOldMATeacherMinDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1032 	TimeConstraint* readOldMATeachersMinDaysPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1033 	TimeConstraint* readOldMAStudentsSetMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
1034 	TimeConstraint* readOldMAStudentsMaxDaysPerWeek(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog);
1035 	TimeConstraint* readOldMATeachersMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1036 	TimeConstraint* readOldMATeacherMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1037 	TimeConstraint* readOldMATeachersMaxHoursDailyHalfDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1038 	TimeConstraint* readOldMATeacherMaxHoursDailyHalfDays(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1039 	TimeConstraint* readOldMATeacherActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1040 	TimeConstraint* readOldMATeachersActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1041 	TimeConstraint* readOldMAStudentsMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1042 	TimeConstraint* readOldMAStudentsSetMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1043 	TimeConstraint* readOldMAStudentsSetActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1044 	TimeConstraint* readOldMAStudentsActivityTagMaxHoursDaily(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1045 	TimeConstraint* readOldMATeacherMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1046 	TimeConstraint* readOldMATeachersMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1047 	TimeConstraint* readOldMAStudentsSetMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1048 	TimeConstraint* readOldMAStudentsMaxSpanPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1049 
1050 	//
1051 	SpaceConstraint* readBasicCompulsorySpace(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1052 	SpaceConstraint* readRoomNotAvailable(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1053 	SpaceConstraint* readRoomNotAvailableTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1054 
1055 	SpaceConstraint* readTeacherRoomNotAvailableTimes(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1056 
1057 	SpaceConstraint* readActivityPreferredRoom(QWidget* parent, QXmlStreamReader& xml, FakeString& xmlReadingLog,
1058 		bool& reportUnspecifiedPermanentlyLockedSpace);
1059 	SpaceConstraint* readActivityPreferredRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1060 	SpaceConstraint* readSubjectPreferredRoom(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1061 	SpaceConstraint* readSubjectPreferredRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1062 	SpaceConstraint* readSubjectSubjectTagPreferredRoom(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1063 	SpaceConstraint* readSubjectSubjectTagPreferredRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1064 	SpaceConstraint* readSubjectActivityTagPreferredRoom(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1065 	SpaceConstraint* readSubjectActivityTagPreferredRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1066 	SpaceConstraint* readActivityTagPreferredRoom(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1067 	SpaceConstraint* readActivityTagPreferredRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1068 
1069 	SpaceConstraint* readStudentsSetHomeRoom(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1070 	SpaceConstraint* readStudentsSetHomeRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1071 	SpaceConstraint* readTeacherHomeRoom(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1072 	SpaceConstraint* readTeacherHomeRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1073 
1074 	SpaceConstraint* readTeacherMaxBuildingChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1075 	SpaceConstraint* readTeachersMaxBuildingChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1076 	SpaceConstraint* readTeacherMaxBuildingChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1077 	SpaceConstraint* readTeachersMaxBuildingChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1078 	SpaceConstraint* readTeacherMinGapsBetweenBuildingChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1079 	SpaceConstraint* readTeachersMinGapsBetweenBuildingChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1080 
1081 	SpaceConstraint* readStudentsSetMaxBuildingChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1082 	SpaceConstraint* readStudentsMaxBuildingChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1083 	SpaceConstraint* readStudentsSetMaxBuildingChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1084 	SpaceConstraint* readStudentsMaxBuildingChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1085 	SpaceConstraint* readStudentsSetMinGapsBetweenBuildingChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1086 	SpaceConstraint* readStudentsMinGapsBetweenBuildingChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1087 
1088 	SpaceConstraint* readTeacherMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1089 	SpaceConstraint* readTeachersMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1090 	SpaceConstraint* readTeacherMaxRoomChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1091 	SpaceConstraint* readTeachersMaxRoomChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1092 	SpaceConstraint* readTeacherMinGapsBetweenRoomChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1093 	SpaceConstraint* readTeachersMinGapsBetweenRoomChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1094 
1095 	SpaceConstraint* readStudentsSetMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1096 	SpaceConstraint* readStudentsMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1097 	SpaceConstraint* readStudentsSetMaxRoomChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1098 	SpaceConstraint* readStudentsMaxRoomChangesPerWeek(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1099 	SpaceConstraint* readStudentsSetMinGapsBetweenRoomChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1100 	SpaceConstraint* readStudentsMinGapsBetweenRoomChanges(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1101 
1102 	SpaceConstraint* readActivitiesOccupyMaxDifferentRooms(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1103 	SpaceConstraint* readActivitiesSameRoomIfConsecutive(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1104 
1105 	//For mornings-afternoons
1106 	SpaceConstraint* readTeacherMaxRoomChangesPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1107 	SpaceConstraint* readTeachersMaxRoomChangesPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1108 	SpaceConstraint* readStudentsSetMaxRoomChangesPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1109 	SpaceConstraint* readStudentsMaxRoomChangesPerRealDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1110 
1111 	SpaceConstraint* readOldMATeacherMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1112 	SpaceConstraint* readOldMATeachersMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1113 	SpaceConstraint* readOldMAStudentsSetMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1114 	SpaceConstraint* readOldMAStudentsMaxRoomChangesPerDay(QXmlStreamReader& xml, FakeString& xmlReadingLog);
1115 };
1116 
1117 #endif
1118