10.5--------------------------------------------------------
2From different old custom FET-MA users, for the new mornings-afternoons mode, on forum:
3
4https://lalescu.ro/liviu/fet/forum/index.php?topic=4519.0
5
6- Students (set) min half-days per week (suggested by Abdeljalil Elghazoui) - but is it needed, considering we have available min mornings/afternoons and min hours daily without allowing empty real days?
7
8- Max days per week for a room,
9- Max hours daily (half day) for a room,
10- Max hours daily (real day) for a room (suggested by bachiri401).
11
12- Default 100% or saving the value of min days between activities constraints when adding a split activity (suggested by Mohamed Ait Ichou).
13
14- Another suggestion, is it possible to combine morning and evening periods during viewing. That is, it is not divided between morning and evening periods (suggested by Mohamed Ait Ichou).
15
16- Drag and drop manual timetabling in the time horizontal view timetables (suggested by Abdeljalil Elghazoui).
17
18- Suggested by BOUHADEF (https://lalescu.ro/liviu/fet/forum/index.php?topic=4501.msg25467#msg25467):
19There is an important constraints if it can be added
20Max resting hours between morning and afternoon. With the possibility of setting it 0.
21This restriction is important for schools that provide food as students cannot be discharged at the end of the morning or the first hour in the evening.
22Also important for teachers who live far from the institution. Breaks between morning and evening are tiring for the teacher as he cannot move home.
23Also if it is possible to space constraint
24 As set of activities are in the same room if they are consecutive
25with a weight less than 100%.
26Also, please add it in space constraint
27My important place if possible is
28a set of activities occupies minimum different rooms
29
30- Suggested by nguyenhuuduyet (https://lalescu.ro/liviu/fet/forum/index.php?topic=4501.msg25772#msg25772):
31Can you help me. I want when entering the teacher's name will be displayed immediately like the official version.
32Example: 1. Enter the teacher's name
332. Add
343. OK
35Then the teacher's name will appear in item 4
36
37From mohammed, on forum (https://lalescu.ro/liviu/fet/forum/index.php?topic=4805.0):
38- Teacher(s)/students (set) activity tag min hours continuously.
39
40From ghani1990, on forum (https://lalescu.ro/liviu/fet/forum/index.php?topic=4729.0):
41- Activity(ies) start(s) or end(s) students day.
42This was implemented as a custom version for him, but it is ugly/not perfect, because each half day may contain only one
43such activity, and the implementation is not perfect (even if ghani1990 says in practice it works very well).
44ghani1990 says on that forum topic that this is to ensure that optional activities begin or end the students' day. But a
45perfect way to do this would be to divide the students and add all the activities for a students set, all the activities
46without the optional ones for another students set, and add max zero gaps for these students.
47
48From bachiri401:
49- Constraints teacher(s)/students (set) min hours per afternoon.
50-> And in general every constraint referring to days should have a corresponding constraint for real days,
51and every constraint referring to mornings should have a corresponding one referring to afternoons.
52
53From Mohamed Ait Ichou: He suggests good printing and output.
54Liviu Lalescu: In case of mornings-afternoons, to print and output the same real day continuously?
55Mohamed Ait Ichou: Yes, morning and evening combined in one day in case of printing.
56
57From Ziani Ben Alia: Please add the following condition: Maximum rest periods between morning and evening for teachers.
58Liviu Lalescu: I am sorry, but this is too difficult. But maybe you could use max gaps per real day and max span per real day.
59Also suggested by saidmechri: Max resting hours between morning and afternoon for teacher (https://lalescu.ro/liviu/fet/forum/index.php?topic=4951.0).
60
611----------------------------------------------------------
62From Liviu Lalescu:
63
64These are some rather technical problems, for developers, referring to some possible improvements in the generation code:
65
66- In the initial order, in nIncompatible, consider also teachers(students)intervalMaxDaysPerWeek, like in teacherMaxDaysPerWeek
67
68- Make students max gaps per day perfect. This is very difficult/complicated. Any bug/mistake would be critical.
69
70- Instead of if-else, use switch in rules.cpp when there are many alternatives (like in modify teacher or read time/space constraints).
71Also in the all time/space constraints dialogs in the interface.
72
732----------------------------------------------------------
74From Volker Dirr:
75
76Disable menus and shortcuts (in FET main form) if they are currently not
77usable. For example: Disable teacher constraints, if there is no teacher
78in the dataset. Disable space constraints if there is no room in the
79dataset. (Disable means: Just make them unavailable/gray. Don't hide
80them. Do it like OpenOffice.org, Firefox, etc.)
81
823----------------------------------------------------------
83From Horatiu Halmajan:
84
85Max gaps constraints with weight under 100%
86
87Liviu: This is very difficult.
88
894----------------------------------------------------------
90From Horatiu Halmajan:
91
92Horatiu:
93I met a situation: a teacher asks for maximum 2 working days, but these
94days should not be consecutive.
95
96Is there a way to implement it in FET?
97
98The only (manual) way I could think of, is to set the teacher as
99unavailable on Tuesdays and Thursdays, thus leaving him available on
100Monday, Wednesday and Friday (any two of these are unconsecutive).
101
102Any other ideas...?
103
104Liviu:
105I have another idea: add a dummy activity for this teacher, split into 2
106per
107week, min n days = 2, with 100%. You just need to take care that this
108teacher
109has place for these dummy activities (enough slots in the day) and to
110consider
111these dummy activities as possible gaps, so if teacher has max gaps 2 then
112make max gaps for him 0.
113
114Horatiu:
115For my case, the second idea worked perfectly, as my teacher does not accept
116gaps.
117
118I have also "played" with the first with the first idea, as it seems to be
119the most un-restrictive one. It also worked. I tried it three times, and in
120all three situations at least one of the dummy activities was the first or
121the last activity for the teacher's day. So, there is a chance that the
122teacher would end up with only one gap.
123
124Which leads me to a suggestion: An activity ends (or starts) a teacher's day.
125Similar to "an activity ends students's day".
126
1275----------------------------------------------------------
128From daviodan:
129
130I will refer to sample_Brazil_more_difficult_max_2_gaps_for_teachers.fet
131
1321. In the FET activities dialog there exist more filters after the teacher, group, etc.
133If we choose for instance the subject "Math" and we do the filtering also after the name of
134the teacher, then the list of the filter should contain only the name: Bruna,Silvania,Wellington,
135because only these teach Maths. In the present moment the filter contains the list of all teachers.
136The same for all the other filters.
137
1382. In the teachers' statistics dialog, when we click a teacher, there should appear in the right
139in a box all the constraints for this teacher inputted by that moment.
140
1416----------------------------------------------------------
142From Volker Dirr:
143
144for code cleanup always use the same style:
145some constraint c have
146c->teacher_ID
147others have
148c->teacher_Index
149
1507----------------------------------------------------------
151From Azu Boba (modified/updated by Liviu Lalescu):
152
153About timetable view teachers: ... I propose is to
154have fixed cell height and width so it would be easier to comprehend and
155pinpoint what you see when switching between teachers.
156We have a 3D table (teachers/days/hours). I propose to
157add a new view named e.g. "View (day for teachers)" (of course you keep
158the "View (teachers)" too). This view will be similar to "View
159(teachers)" but it will have all the days as selectable tabs on the top.
160The 2D table it will display below the tabs would be the Teachers/Hours
161view for the day selected. The buttons and functionality will be the
162same as in the case of "View (teachers)". ...
163The best part though is that with this
164new View you will be able to better comprehend/modify the schedule in a
165day by day base...
166You might also want to consider adding an additional flag when locking
167an activity. This flag might be called "Save data and timetable flag"
168and would be set when an activity is locked automatically during the
169"Save data+timetable as..." procedure. Why? Mainly, because when you
170want to unlock e.g. a specific day in a "Save data+timetable as..."
171saved timetable you do not want to unlock all the activities of the day;
172you want unlocked only the ones that were locked by the "Save
173data+timetable as..." process. There are activities that the schedule
174creator manually locked them before FET generated the table (e.g. a
175specific lesson needs to happen only on a specific day and time). By
176selecting and unlocking a whole day as things are now you unlock these
177activities too! This means that if the schedule creator doesn't pay
178enough attention he might mistakenly create a schedule with activities
179set at undesired hours. The solution I propose to this is to toggle
180between locked/unlocked only the activities that have the "Save data and
181timetable flag" set. To unlock the manually locked ones the user would
182have to do it in a different/manual way (see the paragraph below about
183the editable "Details" box) or even better be asked with a message box
184if he wants to unlock the manually locked activities too.
185I also mentioned that in order to remove a teacher from a specific day
186(because he is ill or on a leave) I have to go to "View (teachers)" and
187pinpoint all the activities assigned to the teacher for this day
188(checking their IDs from the "Details" text box and then writing them
189down in notepad). Then I close this view and go to the "Activities"
190list, find the specific activities and uncheck "Active" for them. This
191is a little annoying and a prone to errors procedure especially if there
192are more than one teachers missing. What I thought as a solution for
193this has to do with the "Details" text box on the "View (teachers)". It
194would be great if it wasn't just a simple text box but an editable
195interface for every changeable value. What I have in mind is to split
196the "Details" into two parts; the upper part would include all the non
197editable values while the lower part all the editable ones. Right now
198for me, only the "Active" and "locked time" values are worth of being
199editable, so simple check boxes would suffice but someone else might
200want other values editable too (e.g. Total number of students, duration)
201or new values worth being editable might be added in the future, so it's
202a good thing to have.
203Last but not least (and certainly the most difficult modification) it
204would be great if you could drag and drop activities in the "View
205(teachers)" and "View (day for teachers)" GUIs. Of course by doing so
206you create conflicts and this will need handling. But I think all the
207before mentioned changes are enough work for you now and I need to think
208this a little more to come up with a viable solution.
209
2108----------------------------------------------------------
211From Marco Barsotti:
212
213The only thing that I would like to find in a future version of FET is the
214ability 1) to find when a combination of constraints is impossible to
215respect. 2) to recognize which constraints generate a bottleneck, where FET
216stand by searching the little hole where to pass and go on, placing
217activities.
218
2199----------------------------------------------------------
220From Saad (on forum):
221
222Manual improvements of the timetable.
223
22410---------------------------------------------------------
225From Volker Dirr:
226
227Change remove redundant to deactivate redundant.
228
22911---------------------------------------------------------
230From Volker Dirr
231
232I got reports from a user that he had trouble to find the correct
233output files today, because there were so many files in the directory.
234
235just maybe:
236maybe write only the index file into the result directory. then make 3
237subdirectories. one subdirectory with all html files, one with all xml
238files and one with all csv files. so we don't need the export menu
239anymore, because it is exported always by default and the directory is a
240little bit more tidy.
241
24212---------------------------------------------------------
243From Volker Dirr
244
245We have:
246
2471. category: 3-4 classes
2482. category: 5 courses
2493. category: 4 religions (always same time, so i didn't enter it)
2504. category: several working groups (afternoon lesson, so i add them
251manually)
252
253Now have a closer look:
2544 classes * 5 courses * 4 religion is already 80 subgroups.
255so if i also add working groups (lets say 5, but there are more!)
256then we have total 400 subgroups.
257
258that is stupid, because i have only around 100 students in a year!
259
260i think in that case it is wise to enter data not in groups, add
261students
262individual.
263
264that is like high school do it.
265
266- add a year.
267- add groups (NOT with split year, but same names)
268- add a group ALL STUDENTS.
269- add subgroup with all students names into ALL STUDENTS.
270
271- now we need a table to every year:
272	- horizontal are the division names (must not be group names, but
273	can)
274	- vertical must be the student names
275	- every cell is a bool checkbox
276
277no the timetablemaker can check every single student. of yourse by
278checking the studentsname must be added as subgroup into that group.
279
28013-------------------------DONE----------------------------
281
28214-------------------------DONE in FET-6.0.0---------------
283
28415---------------------------------------------------------
285From Volker Dirr
286
287how about displaying "minimum home
288room hours" and maybe also "maximum special room hours" in the teacher
289statistics? because a timetable maker (maybe) need that for his
290planning.
291
29216---------------------------------------------------------
293From Danail Traichev:
294
295You see, this division in subgroups is very complicated - to understand
296and to add by hand. And at the end you came with a lot of subgroups that
297have only formal sense, for the algorithm, but are visible in dialogs,
298in the final chart and everywhere. It should not be like this. One will
299have to divide years in wizard-like dialog, with questions:
3001. How many classes you have for this year?
3012. Define courses for which students from this year study together
3023. Which of these curses start at same time. Group them by this criteria
3034. Define from which classes came students for these courses. Whole
304class is caming, or only part of it? Where other part goes - have rest,
305or has another activity, and if yes - which one?
3065. Define teacher that is teaching in every course.
307
308This is a draft, but some wizard like this will save *a lot of*
309mistakes, and will make program much more user friendly. Then you can
310add internal groups, but not show them to users, or at least show if
311they set some option. Show them only groups and subgroups that they need
312to put in activities, and show these same in final html output.
313
314This is my opinion of user in trouble :-)
315
316Second set:
3171. Ability to select more than one constraint and delete it, or set its
318weight
3192. Ability to disable all informative and warning messages, or to display
320them in status bar or in another log window.
3213. Option to remember last focused control in dialogs - very useful if
322you want by keyboard to open many constraints and change their weight
3234. Constraint "longest gap is n hours"
3245. A way to save last generated timetable and reopen it again (for example
325for printing it with different html level, or for viewing it.
3266. Ability to show free teachers for every position in students and
327teachers timetable - very useful if you want to find somebody to replace you
328
32917---------------------------------------------------------
330From my80s:
331
332also in program we have
333a matrix with days x hours = n x n
334if this is allocated from some activity it should get error in
335precomputing in real time
336if we put another activity 100% in same cell
337
338that would take less time to find mistakes
339
34018---------------------------------------------------------
341From my80s:
342
343export as odt (OpenOffice.org) table (spreadsheet)
344
345See also TODO item #310
346
34719---------------------------------------------------------
348From Danail Traichev:
349
350If you make it how it is now with years, groups and subgroups, it will not
351be complicated for entering and even will not need change in most
352constraint dialogs. What I mean - define "groups of subjects", and allow
353"group of subjects" name to be used in every place where subject can be
354used. Much  like it is now with student sets - both student years, groups
355and subgroups are placed in one control and added from one place.
356
357But of course, I don't know how this will fit with FET internals. And FET
358is fine even without this. It simple will make entering constraints a bit
359easy. The other posibility is if every activity constraint dialog has a
360posibility to select multiple activities, and to filter them by "subject
361group", or at least by "selected subjects". That will make entering
362constraints like in my case easy.
363
36420---------------------------------------------------------
365From Volker Dirr:
366
367maybe it's possible to do Form::setLayoutDirection(Form::LeftToRight) only to the filename or language in menu.
368(bracket bug in Arabic translation)
369
37021---------------------------------------------------------
371From Volker Dirr:
372
373I saw at Les's timetable, that he called hour==period.
374also at wikipedia it´s called period. (see School_timetables chapter, terminology)
375
376I am not sure about that. in German we have the also the word "periode",
377but we don´t use it for timetables. we say hour.
378but maybe that´s just colloquial language. this colloquial language is ok,
379because the schools have 1 schoolhour (45 minutes) or 2 schoolhours (90
380minutes).
381
382but maybe it´s better to use also the word periode, because by this
383schools with 60 minutes activities (2 periods) and 90 minutes activities
384(3 periods) don´t get trouble with the word hour (because it entrap /
385ensnare /
386inveigle so write 1 hour and 1,5 hour. but "hour" is an integer values!
387
388but on the other hand people (maybe) will not understand immediately the
389word period.
390
391so maybe we should write "period (hour)".
392
39322---------------------------------------------------------
394From Volker Dirr:
395
396maybe change "current constaint" into "description", "constraint
397information", "description of the selected constraint", ... (very very low
398priority, maybe one day)
399
40023---------------------------------------------------------
401From Volker Dirr, regarding translation:
402
4031. maybe it's better to be more exact. example: phrases "min hour" better "min hour per day"
404
4052. sometimes the english version isn't always the same.
406
407sometimes you wrote "add current activity"
408sometimes you wrote "add activity"
409sometimes you wrote "add current"
410sometimes you wrote "add"
411i think it should always be the same.
412
413also sentence like: "You have to know that this constraint ..."
414should only be: "This contraint ..."
415
4163. maybe "start" should be "generate" in the generateform.
417
4184.	- if you wrote one or more sentences, please always end with ., ! or ?.
419	- sometimes you wrote "students subgroups", i think you just need to write
420	"subgroups", because teachers have no subgroups.
421	- all "add", "modify", and "remove", "close" phrases should only contain
422	this word. no more words like "current" or "group". maybe wrote them with
423	QObject, because nearly every dialog have this 4 phrases.
424
4255. i think we should think and write a small definition note for english
426phrases.
427
428it looks like in a few times this terms are not always used same/correct:
429hour
430duration
431period
432lesson
433activity
434
435when we write a small definition note, then we have to care about this:
436words must also be correct for schools that don't use "hours" as one time
437hour.
438in Germany one school hour is 45 minutes. but that's no problem. we use the
439same words for that.
440but i remember a letter, a user wrote that he has 60
441minutes hours and 90 minutes hours. so he defined 30 minutes "hours" and
442set duration == 2 or duration == 3 to the activities.
443so the definition and use of hour, duration, period and lesson must also
444match to this.
445
446please let us first a small definition not for this terms:
447hour, duration, periode, lesson, activity
448this will help if we add new or modify old english phrases and it will
449also help translators.
450
4516. maybe: no brackets in "view (students)", "view (teachers)", and "view
452(rooms)".
453
4547. and it looks like we shouldn't use the word "lesson".
455in the most phases it's better to replace "lessons" by "subactivities"
456
4578. that is also why i already asked you to change english translations,
458because some phrases can be shorten.
459for example all sentences with "you", "current" or "that mean" can be
460shorten (in english and german).
461example:
462"If you insert current group to current year, that means that some years
463share the same group (overlap)"
464
465shorten version:
466"Some years share this group if it's inserted."
467
4689. and a maybe other thing. example:
469view in fet-mainform.
470there is "Time contraints (techers)".
471and in this folder is for example "Teachers max gaps per Week".
472i recommend to write just "Max gaps per Week".
473Reason:
474- it's shorter
475- it's clear that it "teachers" contraint, because it´s in that folder
476
477the English version looks fine, because you are always possible to write
478first "teachers". (except on min days between activities. You
479are not able to write Activities first.)
480In German translation it is much more difficult the write "teacher" always
481first. even including the word teacher is a much longer phrases than in
482english. it will be much easier and nice, if we don't write teacher here.
483maybe the same problem in other languages.
484
48524-------------------------DONE----------------------------
486
48725---------------------------------------------------------
488From Volker Dirr:
489
490For multiple generation:
491
492Maybe add a checkbox "shutdown after job is done".
493
49426---------------------------------------------------------
495(see also entry #194)
496From Volker Dirr:
497
498long time goal: code cover planning.
499
50027--------------------------------------------------------
501From bmlahcen13:
502
503for that i advice to start thinking from now to
504- enhance the UI
505- use Database
506- add web client
507- use UML models
508
509and also for the structure, use "int id", this will
510enhance both runtime and will reduce the storage,
511because in the FET xml files, for example to store and
512activity, you have to write again the name of the
513subject, teacher, students and also the day and time
514slot in a solution. the same happens in time and space
515constraints, these 3 entities represent a big
516percentage of the size of the file, so you use int IDs
517and not names you will certainly gain a lot of space
518and also a better execution time, i know, as you said,
519that the internal structure uses int id but for
520loading and saving xml files and searching, the usage
521of strings delays them.
522
523Liviu: maybe it would be better to compress the input file
524
52528--------------------------------------------------------
526From more users:
527
528Improve the user interface - add help and wizard.
529
53029--------------------------------------------------------
531From Michael Towers:
532
533What about a rewrite of the front end in a scripting language - e.g. Python? It might speed
534development and help debugging. It could also make maintenance of the code easier.
535
536Is there some way of doing "interactive" timetable development? The human would make
537suggestions, or place some items, run the program, maybe move a few things around, run the
538program again ...
539
540A clear and clean interface to your engine as an entity separate from the
541input/output might be useful.
542
543It seems to me, it should be possible (but of course only after a lot of work!) to have
544a beautiful manual timetable editor (which can also print the various timetables, and
545perhaps save the data sets and results in a database) with an interface to an automatic
546timetable scheduler which can be used to speed up the work."
547
54830--------------------------------------------------------
549From TheStar:
550
551A constraint to think about is that some activities, and I suspect 'normal school management'
552talks about teachers as in "One teacher per x students".
553
554In the HSC year here, it's about one teacher per 26 students (or something like that).
555At a recent excursion, it was one teacher per 10 students.  Hope that helps :)
556
557Liviu Lalescu: Of course, you can add each student. I could have implemented this solution.
558But I doubt that the user has such patience.
559
560You could always autogenerate the students...
561"Quick-Build Students"
562[Properties]
563[Number]
564(Build)
565
566And it will generate students with name: AutoGen-11231, ID: 11231, and the like.
567
568The user could then 'select' groups of these students... and... (Just an idea)
569
57031--------------------------------------------------------
571From Abdul Hadi Kamel:
572
573Do you have a plan in mind to upgrade the existing fet from standalone
574application to a client-server/web-based database oriented type of
575application in the future. This is because the current fet is quite limited
576especially in terms of timetable data which cannot be keyed-in /view s
577amongs several users at the same time. This will cause hardship because the
578people involved in making the class timetable in universities normally
579consist of several key persons from different departments. Using standalone
580application by several persons sometimes make data consolidation process
581among departments become difficult and error-prone
582
583I think it will be better if the FET can support a single timetable data
584repository (using client-server model) in a database that can be input/view
585by several users simultaneously.
586
58732---------------------------------------------------------
588From Volker Dirr:
589
590If you think that other people don't like this default constaint how about
591making a menu "default settings". there you can add "language" and my
592default wish. maybe there are other parameters, that can be set in this
593settings. I guess that there a people who want set duration to 2 or 4 by
594default.
595
59633---------------------------------------------------------
597From kdsayang:
598
599I would like to see FET generate the time table in
600
6011. certain amount of time for each time table
6022. with some setting about the remaining weight soft conflicts
6033. generate multiple variants
604
605For example
606(A) rules are
607(i) the user select to generate 10 minutes time limit for each time table
608(ii) user set 0 for remaining weight soft conflicts
609(iii) the user select 10 variants
610
611the outcome
612(B)
613(i) the time table finished and it has generate 10 time table that concur with 0 remaining soft conflicts for each time table
614(ii) the time table finish and it only manage to get 5 variants from 0 remaining weight soft conflicts
615(iii) the time table finish BUT it don't manage to generate any variants with 0 remaining weight soft conflicts
616
617refer to (B)(iii)
618
619the user can change
620(i) longer run time to generate time table (with crossing finger) hehe... Others setting is not change
621(ii) longer run time to generate time table with increasing value for remaining soft conflicts (0.5, 1.0, 1.5 etc)
622
623As you can see in timetable --> generate multiple variants, features in (A)(i) and (A)(iii) are already there. I hope that you
624can figure it out on how to implement the feature in (A)(ii). It would be marvelous.
625
62634---------------------------------------------------------
627From kdsayang:
628
629If a user want to add "an activity have a set of preferred rooms", the user will need to click one
630by one to add right???... So, I would like to suggest that we group them like when user want to add
631an "activity". There (activity), we can select by years, groups and subgroup for students. Instead of
632clicking all the student groups in years 1, user can just click year 1 to include them all into students....
633
634For example for rooms (room group then room subgroup)
635
636HALL
637Hall A
638Hall B
639Hall C
640
641TUTORIAL
642A-A1
643A-A2
644B-A1
645
646COMPUTER LAB
647Lab 1
648Lab 2
649Lab 3
650
651So when user want to add "an activity have a set of preferred rooms" for all the tutorial room, instead
652of clicking 20 tutorial room one by one, user just click the group that is Tutorial. Easy right???
653
65435---------------------------------------------------------
655From kdsayang:
656
657What I meant is in Data --> Time Constraints --> Teacher Time Constraints --> A Teachers not available time,
6581. If you double clicked Afida,
6592. It will show Afida not available time right.
6603. Then if you want to change Sambilan not available time by choosing Teacher drop down menu, nothing happen. In fact, It still shows Afida not available time.
6614. So, if you want to change Sambilan not available time, you have to clicked Cancel button first,
6625. then double clicked Sambilan.
6636. Now you can see that Sambilan not available time is updated.
664
665My suggestion is that It will be better If FET can update to Sambilan from Afida in Step no 3.
666
66736---------------------------------------------------------
668From kdsayang:
669
670I have some other suggestion.
671
6721. It will be GREAT if FET can be turn to tree structure. We can show/hide the structure
6732. In the tree structure, we can use the copy, cut and paste to edit the subject, activities, etc in the tree structure
674
67537---------------------------------------------------------
676From kdsayang:
677
678If I want to change many teacher not available time, I need to add one by one although the teacher not available time is the SAME.
679
680So, I suggest that you can add a set of teachers not available time. Same as rooms not available time feature.
681
68238---------------------------------------------------------
683From kdsayang:
684
685On current version, there is no group for subject and teacher. It is quite annoying if you have to look for certain subject X and teacher Y in that list. When the list grows bigger (let say 100), it's kinda hard because you have to find that lecture and subject in that 100 lists. Although the sorting is a good way to find the subject and teacher, IMHO maybe we can make groups in that teacher and subject section
686
687For example I want to find teacher X and subject X. Teacher X is a teacher that teach Diploma IT student. So, I just search that teacher in Diploma IT group rather than searching 100 other list. Same as subject X.
688
689This feature is needed if my/our/your university/school is a big one where teacher and subject are hundreds.
690
69139---------------------------------------------------------
692From Zsolt Udvari:
693
694We've created a timetable but the rooms aren't. So we do it by hand.
695How can I change in FET the rooms simpler in a generated timetable?
696The times are locked.
697It would be the most simplier when I open e.g. the teachers timetable,
698click on a activities and I can add room to this.
699
700Liviu:
701I'm sorry, but you'll have to add manually constraints activity preferred
702room for each of the activities.
703I am not sure I understood correctly the problem, if not, please excuse me
704and explain more detailed.
705
706Yes, imho you understand my problem. I hoped that there is a simpler
707solution. So, maybe in the next releases would be nice: when a
708timetable is generated, user can changes/sets the rooms (only the
709activities without rooms of course) from the timetable (Timetable ->
710Show teachers/students): you select an activity, you click a button
711with "Assign room" and choose a room.
712
71340---------------------------------------------------------
714From Naji:
715
716Hopefully, FET's team can enhanced it to be able to export the xml data to database, that will facilitates the
717output of the data and enables programmers to engage it with their programs.
718
71941---------------------------------------------------------
720From Massimo Mancini:
721
722This is a request for a new feature...
723For Teachers and Subjects I like to use a brief description (BD), a code, and I optionally convert it to corresponding long description (LD) in the generated timetables (I refer to my current timetable procedures). So I need to define two new fields. Example:
724Theacher:  MANC, MANCINI
725Subjects: MAT, MATEMATICA
726
727I think that this can be achieved without any change to current interface, simply using the format above. Of course I want use the BD only in defining activities and when I have to specify subject and Teacher.
728I wish to output the brief (only BD) or complete (LD) timetables
729
73042---------------------------------------------------------
731From jaspal:
732
733INSTRUCTION FOR ALLOTMENT OF SUBSITUTION/ ARANGEMENT PERIODS
734
735On a particular day, faculty can be on leave, or may be busy with some
736other work hence unable to take the assigned classes. Thus, the classes
737taken by those faculty members are to be assigned to some other faculty
738members.
739
740Facility of keeping track of back log periods due to absence or
741unavailability are to be recorded year and group wise in the software.
742Also extra periods taken by the faculty has to be recorded year and group
743wise.
744
74543---------------------------------------------------------
746From ßingen:
747
748For the internal organization of my school, it's convenient to have a general timetable for each
749group, A and B, and our timetabling software gives it. But as you observed, the footnote legend
750style it's not probably the best, as it's a little bit difficult to understand. I think in FET a good
751solution could be to be able to define a group of activities for a group (for example A, or even the whole
752year A and B), and then subdivide this group of activities in many subactivities, each of them
753with its own teacher and classroom (I have read the term "subactivity" in the manual, but I
754can't find a definition of it, nor find it in FET menus). So a group would be attending many
755activities at a time, which is not possible right now in FET. Maybe if it represents a structural
756problem FET could define internally subgroups, but being transparent for the user. This activity
757group should have a user defined name to identify (for example "Optative 1"). And then inside,
758each subactivity would have the real subject ("French language", "Arts", etc.). In this way the
759user would avoid to define such a great number of subgoups, and in the teacher's timetable
760everything would appear right and clear, with no reference to the activity group, just to his own
761subactivity, and with information of room besides of the group (opposed to the pseudoactivity
762solution to book the room).
763
764In the group timetable, the common activities would appear as always, and the others would appear
765with the activity group name. Then parallel timetables with blanks in the common activities and
766one of the subactivities for the rest could be printed . So we would need as much timetables as
767the maximum number of subactivities of the largest activity group. Maybe the subactivities could
768be diplayed in couples to avoid many timetables, as it happens now with group timetables and
769"same day+hour" activities.
770
771These parallel timetables could be hanged up on the classroom board, and, of course, each pupil
772should know which of the subactivities has to attend. I think this display should be clearer than
773the footnote legend style. I don't know if I have explained it clear enough, but if not I could
774send a spreadsheet with an example.
775
776Also, with this solution, if no activity group are defined all works as before, so we would avoid
777the problem commented by Liviu of people not needing it.
778
77944-------DONE since FET-5.19.0-(10 January 2013)-----------
780
78145---------------------------------------------------------
782From Massimo Mancini:
783
784SUGGESTION BY: Massimo Mancini
785
786WHERE: add activity form
787
788WHAT: a check box to lock the total duration of activity
789
790WHY: to introduce an automatic check and alert on the sum of durations of
791single subactivities (currently the total duration reflect always the sum,
792so if you alter the single duration, FET recompute the total, this can be
793what you want or maybe not)
794
795WHEN: all new future are always ASAP :-D (the programmer says...)
796
797FURTHER DEVELOPMENTS: a templates system for automatic generation of activity based
798on year and subjects expected for a class of that year (normal italian
799situation, abroad I don't know ;-)
800
80146---------------------------------------------------------
802From ßingen:
803
804- In my school the timetable is divided in morning (from 8:00 to 14:30h) and afternoon (15:00 to 17:00h). In the morning there's a break from 11:00 to 11:30h.
805I have defined this break as an hour of the timetable, but not allowing activities for any set of students in this slot. The reason is to plan the surveillance
806of the teachers in this slot. There must be always 2 teachers looking after the pupils during this period, so I define activities without students.
807The problem is that if a teacher does not have surveillance at break time, it should not count as a gap. If I define this slot as break in "Misc time constraints"
808then I can not define the surveillance activities.
809- We try that all the teachers work maximum 2 afternoons per week. This has been easy to define with "All teachers work in an hourly interval max days per week".
810But we try also that teachers who work two days per week in the afternoon to have a free morning. I don't know how to define this situation.
811
81247---------------------------------------------------------
813From T. Renganathan:
814
815You can include a provision for multiple selection of subjects, teachers,
816activities, etc., for example using Ctrl or Shift key. This will especially be useful for deleting
817multiple entries.
818
81948---------------------------------------------------------
820From Volker Dirr:
821
822Volker:
823if i am in FET->Data->Subjects
824i can't see at the right side all constraints.
825
826in my latest samplefiles for example the "a set of subactivities has a
827set
828of preferd time slots" is missing to that subject.
829
830also in FET->Data->Activity Tags are not all constraints displayed.
831
832Liviu:
833Yes, I know, because these are related to activities. I chose not to show them.
834
835Volker:
836please add in TODO. i think this is a nice feature we should not forgot.
837
838Liviu:
839I thought about your proposal. I think it cannot be done and I know the reasons why I didn't do that:
840a constraint activities preferred starting times has subject "" or specified. If it is "", then it is for
841all subjects. So, I should write all constraints of this type with subject "" for each subject. But this
842is not correct. A constraint might have a teacher who doesn't have this subject.
843
84449---------------------------------------------------------
845From Volker Dirr:
846
847by the way we should add a new tests before generating a timetable:
848if 2 activities are grouped, then turn of min n day constraint of that
849activities.
850if 2 activities are consecutive, turn of min n day.
851if 2 activitives have same starting time, turn of min n day.
852
853or the opposite, bedending on what has a higher weight.
854
855maybe instead of turning of maybe just warn the user that this two
856constraints are not acceptable at the same time and tell him he should
857care about that problem first of all (by removing or reducing weight to
8580%).
859
86050---------------------------------------------------------
861From Les W. Johnstone:
862
863Hi Liviu,
864
865I'm into the thick of it again scheduling...
866now working on two different schools...
867
868Sacred Heart College is not a problem since they use a five day blocked
869schedule. Saint John's College though is a slightly different problem...
870
871They have a five day AB schedule...
872
873which means I entered two activity groups... one for week one and one for
874week two and used different activity tags... w1 and w2 to keep things
875separate, with specific rules of placement of w1 in Week1 and w2 in week
8762...
877
878However, your spacing feature doesn't work ... not on more than five
879days.... not sure it would be possible to extend your logic or not... (what
880do you think?)
881
882The other thing I've noticed is a bit of an annoyance concerning
883constraints... when you are trying to get a schedule to work you push in
884constraints however, on slight modification of activities (concerning
885resources etc.) sometimes, what was once soluble becomes insoluble.
886
887Usually this means you have to relax constraints in order to get the
888schedule soluble... some (most) can be set to a 0% weight which means they
889are ineffective.. then later you can turn them on again... however, some
890rules are only acceptable at 100%... which means you need to drop them from
891the constraint set...
892
893but the constraint may be important and be forgotten to reimplement...
894could you set an active/inactive flag for constraints like you have for
895activities... so it can later be reimplemented?
896
89751---------------------------------------------------------
898From Chafik Graiguer:
899
900Liviu:
901There is no easy way to remove a component.
902
903Chafik Graiguer:
904well
905to re-use  last year .fet file,
906what about
907-removing all activities at once, so Data keeps only subjects, teachers and groups ?
908or
909- removing all teachers from all activities (because teachers dont teach the same groups every year)
910or
911- removing all groups from all activities
912
913Liviu:
914I just looked in the sources and it seems that in statistics I only count active activities. Please verify that, though.
915
916Chafik Graiguer:
917yes !
918and I spend nealy ONE hour counting periods for teacher  Eng1!!
919in Statistics, teacher  Eng1 has only 20 hours
920in Data  ---> activities, I count 21 hours :-))  for him
921finaly, I realised that I has deactivted one hour component by mistake
922
923so, is it possible to add this line into activity window:
924Quote:
925Activity:
926Teacher=fr4
927Subject=fr
928Students=2Lg -1
929Id=1
930Activity group id=1
931Duration=1
932Total duration=5
933Total active: XX
934Active: yes
935Total number of students=0
936
937-----------addition:
938Chafik Graiguer:
939- removing all groups from all activities
940sorry, removing groups does not make sense, because, activities should keep group's information
941Groups have the same set of activities every year
942
943So the most important is:
944-removing all activities at once, so Data keeps only subjects, teachers and groups ?
945but this is not so good, as we will lost time and space constraints related to those activities
946So, the best of the best is:
947- removing all teachers from all activities (because teachers don't teach the same groups every year)
948so we can re-assign new teachers to groups
949
95052---------------------------------------------------------
951From Massimo Mancini:
952
953Consider this:
9541. I inspect the activities of a teacher (via filter on teacher)
9552. I see the lack of an activity (or I delete one or more filtered
956activities because I want redefine them)
9573. I push the add buttom... why the subjects aren't
958only those that teacher teach?
959
960A more general question... why not associate in advance the teacher with
961his students and with the subject he teaches? In this way I could obtain some
962type of automatic filter.
963If I add an activities of mines I select MANC but MANC teach MAT in GEO_1B,
964GEO_2B, GEO_3B and IGE_1A. The program should be aware of this.
965
96653---------------------------------------------------------
967From Massimo Mancini:
968
969When I review generated timetable with view (teachers) menu option I can lock/unlock
970the placed activities and this is ok. But why I cannot do the same for
971empty cell? The meaning of locking an empty cell should be to add/modify a
972Teacher not available constraint or something that have the
973same effect... so a new generation leaves those positions untouched.
974
975A I said I would to lock/unlock some students or some teacher and
976recalculate the rest.
977
97854---------------------------------------------------------
979From Frans Cilliers:
980
981About campuses: What I thought is the following. Currently you have min
982gaps between buildings and maximum building changes per day. If this can
983also be done for campuses, for example minimum gaps between campuses for
984teachers. (An extra constraint but it will probably be to difficult as
985you mentioned)
986
98755---------------------------------------------------------
988From K:
989
990Maybe you remember my post from April (many teachers – many groups). Since
991than in our team we’ve been trying to adapt our internal solutions to use
992FET (it is really your great success).
993We tried to use FET to solve timetable for a pretty big plan and by the
994way we had to solve a few problems and got some experiences as an
995end-users. Maybe it would be interesting also for you.
996...
997    The third problem was to export data from the program we use for planning
998(a database application) to FET and than import data back. I pre-assumed I must
999enter data to the FET automatically as the number of activities and
1000constraints is too high to handle them manually. Also a plan generated by
1001FET had to be automatically imported to our database. I used FET
1002procedures to import teachers, students and rooms. I also tried to use
1003FET import procedure for activities too but I had a problem with IDs. FET
1004generate its own ids but I needed to use my own ones to keep link between
1005data in the database with those in the FET so finally I decided to
1006generate input file instead. Fortunately FET doesn’t change ids and
1007generate perfect XML file with generated plan and
1008thanks to known ids I could import data from FET to our database with no
1009problem.
1010    The next point. Due to number of constraints we have in our database I
1011used similar procedure to generate a part of FET input file with teacher
1012time constraints and room time constraints. Hence I have a question.
1013Would it be possible to include file path into FET input file to keep
1014data in a couple of separate files as working with 100 000 lines file is
1015not fun?
1016    We prepared the whole procedure for timetabling with FET. First we
1017planned (in the database program) activities for VIPs manually. To use FET
1018we also had to put into the timetable all activities where students from
1019one group could choose one activity from a several ones (languages and
1020some lectures) at the same time. That is why in the input files are so
1021many “permanently locked” activities and activities with many groups and
1022only 10 students to avoid conflicts with room capability (I used
1023<Activity_Tag>UL to mark them). Together with these activities we locked
1024a room by preferred_room constraint. After that I included prepared data
1025to the FET input file and after all we started to generate
1026the plan. Fortunately FET is smart enough to find mistakes in locked
1027activities (room and time conflicts) so than we removed conflicts for
1028already planned activities.
1029    By the way – during reading the input file I noticed the error
1030that rises when the number between tags:
1031<Number_of_Not_Available_Times>NUMBER</Number_of_Not_Available_Times>
1032was  not exactly the same as the number of constraints in the file. Of
1033course it is not a bug. It never happens if user use FET to input
1034constraints. But it forced me to count constraints during generating data
1035and shows that program is rather “sensitive”.
1036The first hint for other users is to start with minimum number of
1037constraints and if FET would generate the plan than thinking about adding
1038the next ones. In TODO file I found the suggestion of “possibility to
1039disable constraint without removing it. Such 'Active' checkbox like on
1040activities dialog”. I admit – it would be nice. Moreover finding a good
1041plan is just like using 10 knobs increasing one constraint and decreasing
1042the other so fast access to the constraints window is crucial. I suggest
1043to put “Time constraints” and “Room constraints” buttons also in the main
1044menu (or creating any other shortcuts) as these constraints are rather
1045deep in the menu.
1046The next suggestion is to change the interface for some constraints
1047(particularly wherever there is a long list). For instance for the
1048constraint Max day for a teacher per week if we have many teachers a
1049simple table like:
1050
1051| Teacher Name | Max days|
1052| teacher 1    |     n   |
1053| teacher n    |         |
1054
1055with a button “Save all changes” would be great. Now we have to enter
1056value for every teacher one by one in separate windows.
1057    After setting constraints we tried to generate the next version of the
1058plan. We added more and more constraints (for instance WOLNE – dump
1059activities - free day for student or increasing max day for teacher) and
1060I was really surprised when FET coped with that. It took from about 1,5
1061minutes (almost no constraint) to over 20 minutes (with many constraints).
1062With too many constrains after
1063about 10 minutes when I saw no change in the number of placed activities
1064(neither up nor down) I cut simulation, removed some constraints and
1065started it over.
1066    The second hint is not to change too many constraints in one simulation
1067as it may lead to impossible timetable and than it is difficult to say
1068which particular constraint was too much.
1069    Of course there is a lot of work to do. For instance even when two
1070consecutive activities are placed at one day (the same group and the same
1071teacher) sometimes there are placed at different rooms what would force
1072them to needless changing room. I guess that FET is focused on fulfilling
1073constrains but not on optimizing timetable. Sometimes simple changing of
1074two activities makes plan better both for students and teachers. I think
1075that manually improving generated plan is faster than creating many many
1076more constraints and repeating simulations. And this is the third hint.
1077
107856---------------------------------------------------------
1079From Chafik Graiguer:
1080
1081When a user click on Data ---> activities
1082he is presented with a list of all activities because filter fields are empty
1083all activities are listed based on Activity Id
1084Now, is it possible to a add sort feature like this
1085Sort by:
1086	Teachers
1087	Students
1088	Duration
1089	Subject
1090	Act Id
1091
1092So for example, if you select teachers, all activities will be listed alphapetically in a ascendent order
1093
109457---------------------------------------------------------
1095From Massimo Mancini:
1096
1097In advanced lock/unlock I would lock/unlock on teachers basis (with pick up
1098the teacher from list of teachers) or on students groups basis (always from
1099a list) The lists are mentained from subsequent generations and saved with
1100data.
1101
110258---------------------------------------------------------
1103(see also items #149, #368, and #396)
1104From Massimo Mancini:
1105
1106I have another suggestion: an history file where you record all the actions
1107of the timetabler and theirs effects. If the history was visible in a a frame
1108in the View timetable forms, I would see scroll the messages without interruption
1109and with the opportunity to review them (please don't answer that is too
1110complicated... you can use a tab widget, a tab for the current situation
1111another for history... the right answer is: GREAT! I add it in TODO! ;-))).
1112In general an history file should be a great thing and the base for
1113undo/rollup features.
1114
111559---------------------------------------------------------
1116From George Milliotis:
1117
1118I propose the ability to sort constraints by:
11191. Type [so single ones - ones that you can't add twice - go to the top]
11202. ID of activity
11213. room / day
1122and so on
1123
1124This could also be done for activities. If I add two activities for the
1125same subject, why do I need to have one at the bottom (id 200) and the
1126other at the top (id 5)?
1127
1128BTW, I haven't used the menu once since I got this new version. I like
1129the basic concept of the shortcuts. If the dialogs were not modal I'd be
1130opening all sorts of windows and working much faster. If I could HIDE
1131buttons selectively I'd even be able to get the secretaries to do the
1132schedule and save ALL my time.
1133
113460--------------------------------------------------------
1135From Frans:
1136
1137I refer to the Data menu, space constraints and say students, set of home rooms and then add.
1138In this box I select the students and then the individual venues.
1139
1140If I for example already defined an activity tag for Large rooms, I want to add the activity tag
1141instead of the individual venues.
1142
1143Now that I think again I doubt if it will be possible, because FET has to make a distiction between
1144general activity tags and "room" activity tags as the room activity tags must also appear in the rooms
1145list so that it can be selected. How will FET know this.
1146
114761--------------------------------------------------------
1148From Volker Dirr:
1149
1150an other useful feature is:
1151modifying in settings the default min days constraint (for add activity).
1152
1153because we nearly always use 100%, not 95%.
1154
1155modifing later all to 100% isn't the best, because there are a few
1156activities with min days = 0%.
1157
115862------------------------DONE-----------------------------
1159
116063-----------------------DONE------------------------------
1161
116264---------------------------------------------------------
1163From aliponte:
1164
1165An activity tag can be assigned the property not to count the underlying activities.
1166
1167Please consider also this flag to affect the constraints with "days". A pseudo activity should not increase the number of days (if it is the only
1168activity of a day). A pseudo activity should be "invisible" for all countings concerning constraints, and for countings concerning statistics (teachers, students, subjects).
1169
117065---------------------------------------------------------
1171From aliponte:
1172
1173There are many suggestions from FET users to improve FET's UI. It will be nearly impossible to find a UI that meets everybody's needs, I know. But let me just present, what was confusing me for a while. Maybe I'm not the only one.
1174
1175Dialog "Modify activity":
1176Changing the state of the check box "Active" does not change the active/passive state of all subactivities that belong to the same activity. It affects only the single subactivity that shows in the tab (= the one that has been highlighted bevor the dialog was opened). If I want to activate the whole activity I have to click through all of the tabs. (It took some time until I understood this.)
1177
1178Since there are two dialogs, one for activities and one for subactivities the (novice) user does not expect the possibility of editing individual subactivity properties in the activities dialog (because individual activation and individual duration of subactivities can be chosen in the subactivities dialog).
1179
1180By the way, is it really necessary to have two dialogs? I could imagine a check box "subactivity only" in a common dialog for both, activities and subactivities. This would make this comment obsolete.
1181
118266---------------------------------------------------------
1183From Chafik Graiguer and Pietro (see also items #145 and #248):
1184
1185DONE since FET-5.41.0 - 2019-11-20 --> -Min hours daily with an activity tag (to count real activities only leaving pseudo activities out of count) <-- DONE
1186-Min hours continuously with an activity tag
1187
118867---------------------------------------------------------
1189From Gert Veltink:
1190
1191I would be very pleased, if in a future version it would be possible to specify the number of students for an activity as an extra column in the activities.csv.
1192
1193Rationale: I mainly use FET for planning examinations. In this setting the number of calculated participants and actual participants differs significantly, because students have to repeat examinations or do not register for examinations.
1194
119568---------------------------------------------------------
1196From Mr Robo:
1197
1198In the Time tab, Break button, leading to the dialog to set up break times... At the moment, I set up one break time constraint that has
1199morning breaks and lunch breaks combined.
1200
1201If I set up two (one for break and one for lunch) and I could attach a label that would be displayed in the unavailable slots in the
1202finished timetable, such as 'Break' or 'Lunch', it would save me having to edit each Student, Teacher and Room timetable before they
1203can be printed, etc. It's quite manual at the moment because '-X-' is used throughout and I can't do a global search and replace.
1204
1205Also suggested by S Chandrasekar, on forum:
1206
1207It is important to display a text like "LUNCH INTERVAL" or "SHORT INTERVAL" or "ASSEMBLY" in the break slots rather than an
1208"-X-" symbol. Is it possible?
1209
1210Also suggested by Nagendra, on forum:
1211
1212You can consider including this in settings -> timetables -> "Mark break slots with custom text". Let the user decide, whether s/he wants
1213to use the default '-X-' or any custom text. Similarly for 'uniting' the cells.
1214
121569---------------------------------------------------------
1216From George Miliotis:
1217
1218About the "Years", "Groups", "Subgroups" check boxes in add/modify activity and
1219modify subactivity dialogs:
1220
1221I'd be more interested in FET actually remembering these settings
1222globally (not even per form) for each session, no need to actually store
1223to disk.
1224
122570---------------------------------------------------------
1226From Frans (on forum):
1227
1228Frans:
1229
1230I came across the following, it is possible that you know about this:
1231
1232I generate a timetable with constraints such as minimum hours daily for a students set
1233
1234Next from the data, students, groups or subgroup menu I deactivate all activities for one group. This group has the constraint minimum hours.
1235
1236I generate again and then Fet- gives an error message and stops, namely you have too little activities to respect the constraint minimum hours ....
1237
1238In other words I must go to minimum hours and delete the constraint. It is not deactivated automatically.
1239
1240As said I do not know if it must be like this. Other constraints such as same starting time are automatically de-activated.
1241
1242Liviu:
1243
1244It is normal to be like that, because it is hard to take care of such constraints, and because you don't deactivate a students set, but a set of activities. The constraint min hours daily is for a students set, not for a set of activities.
1245
1246Frans:
1247
1248I understand what you say, but I am not talking about deactivating activities.  In my case however I had to deactivate a complete studens set and this one can only do from the data menu. In other words everything for a students set must be deactivated.
1249
1250Studens go out to work in private practice for a few months. During that period they are not on campus and everythig must therefore be deactivated as another students set takes their place and must be scheduled.
1251
1252If it was possible to deactivate everything only when one uses the data menu.
1253
1254Liviu:
1255
1256Yes, you are right in a way, but there are many problems which may appear if I do like you say, and the things are complicated.
1257
1258For instance, user deactivates a students set's activities, then activates only one activity for this user. Or if there is an activity with more students sets, of which some are deactivated and some are activated. Or there might be a global constraint min hours daily for all students.
1259
1260The perfect approach might be to add a flag to each teacher, subject, activity tag, students set -> active or not active.
1261It would be kind of tedious and difficult to change now, as it was not designed from the beginning.
1262
126371---------------------------------------------------------
1264From Jason (on guestbook):
1265
1266Ask for new feature:
1267
1268- Auto generated after allow user to manual adjust timetable (Drag and Drop in view timetable)
1269
127072---------------------------------------------------------
1271From Zsolt Udvari (on forum):
1272
1273If I de-activity all activities of a whole year (student set), FET will not ignore "min hours daily" constraint.
1274So I've two suggestion immedi:
1275- when FET checks this (and similar) constraints, would tolerate this
1276- can deactivate the students set (and related activities, constraints, etc.)
1277
127873---------------------------------------------------------
1279From Zsolt Udvari (on forum):
1280
1281It would be nice when can filter in activities list by "no teacher" and "no students".
1282
128374---------------------------DONE--------------------------
1284
128575---------------------------------------------------------
1286From Chafik Graiguer (on forum):
1287
1288Clone activities or constraints:
1289
1290Is it possible to clone activities for one student set to another?
1291Last year, Year 1S had 3 student sets
1292Now Two new student sets have been added
1293Student sets from same year have same activities and of course same time constraints
1294So how it is possible to do an activities Clone from 1S03 to both 1S04 and 1S05 with or without assigned teachers ?
1295
129676---------------------------------------------------------
1297From Zsolt Udvari (on forum):
1298
1299Default settings per subject:
1300
1301Is there any chance to make it? In my school the all "English" subject is 4 per week (and there are more similar subjects). So it would be nice, when I don't should set these settings (activities per week, tags).
1302
130377---------------------------------------------------------
1304From Chafik Graiguer (on forum):
1305
1306Save button on Activity Planing Window:
1307
1308For users working with activity planning window, they will probably spend most of the time on it
1309But this window is lacking a save button, so users have to close it from time to time to get access to FET main window to save work
1310Can a save button be added to activity planning window?
1311
131278---------------------------------------------------------
1313From Chafik Graiguer (on forum):
1314
1315About constraint min gaps between a set of activities:
1316
1317Now, how about applying this contraint globally? I mean every activities with subject (or tag) Math sould be 2 hours apart from an activity with subject (or tag) Physics?
1318Entering all activities, one by one is tedious
1319How it is easy/possible to add: min gaps between a set of activites with a tag?
1320
1321or better:
1322Min gaps between two subjects/tag
1323
132479---------------------------------------------------------
1325From Chafik Graiguer (on forum):
1326
1327Filter for modify multiple constraints at once:
1328
1329In the min days between activities window
1330there is an option for: Modify multiple constraints at once
1331Is it possible to add a standard filter: teacher, student set, subject, tag ?
1332So I can multi-change only those activities with a given subject or teacher... etc?
1333
133480---------------------------------------------------------
1335From Chafik Graiguer (on forum):
1336
1337Filter teachers:
1338
1339Students are easily filtered because they are grouped using years then groups
1340So at Students set not available time window, we can, for example, apply unvailability to only one year, thus affecting  groups under that year
1341We can also apply unvailability to group, thus affecting  Subgroups under that group.
1342
1343Unfortunately , teachers are treated either individually or totally (constraints for ALL teachers): ONE or ALL
1344Zsolt Udvari already wrote:
1345Quote:
1346It would be nice when can pair teachers with his/her subjects and can filter in the activity dialog.
1347So, what do I think? I'm teaching Math and Phisycs. So to my name can add these subjects and when I add a new activity and select Literature, my name will not shown, only those teachers who teaches Literature.
1348
1349So it would be very practical, less time consuming, to treat teachers per groups based on
1350- Home subject
1351or
1352- any other artificial tag like :
1353-part_time_teachers,
1354- team teachers,
1355-..etc
1356
135781----------------------------DONE-------------------------
1358
135982---------------------------------------------------------
1360From Valdo (on forum):
1361
1362Conclusion: he has many teachers, and almost all should have max 2 gaps per week, with 2 exceptions, who may have more gaps. He
1363does not want to add manually that many constraints. So, he suggests that FET should add constraints for all teachers,
1364with a selected number of max gaps per week, and then the user can modify each one by hand.
1365
1366(Suggested indirectly also by Julio González Gil, on the forum.)
1367
1368Added on 2017-07-31, by Valdo, on the forum: He wanted to add teachers' max hours daily 4 for all teachers, with an exception to allow max 5 hours daily for
1369a single teacher. There were too many constraints to add.
1370
1371Suggested also by utismetis, on the forum, on 2017-08-07.
1372
1373Suggested also by Davide Cottignoli, on the forum, on 2017-08-18.
1374
1375Suggested also by mercurialuser, on the forum, on 2017-09-05.
1376
1377Suggested also by auriolar and Rodolfo Ribeiro Gomes, on the forum, on 2018-04-15 (they suggest to add exceptions to the general constraint).
1378Rodolfo Ribeiro Gomes: I don't think it needs to change the constraint names. Just add the 'exception' field.
1379
1380Suggested also by pg788, on the forum, on 2018-07-02
1381
1382Suggested also by satellite2, on the forum, on 19 December 2018 (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0):
1383	There are very useful time constraints for me concerning teachers (or students) such as "max days per week for a teacher (or for all teachers)".
1384I want to use this constraint for the majority of teachers but not all of them. We have some teachers that have to teach 5 days a week because their
1385course load is impossible for less days. I wonder whether there is a way to adapt this constraint like "max days per week for the selected teachers"
1386or "max days per week except these teachers" instead of entering all of the teachers one by one. Is this difficult to implement? (Because there are
1387lots of teachers in the university).
1388
1389Suggested also by Zafar Allah Askar (on forum), on 26 October 2019 (https://lalescu.ro/liviu/fet/forum/index.php?topic=4313.0):
1390	Create lists of teachers to be added to a constraint.
1391
1392See also TODO item #84.
1393
139483---------------------------------------------------------
1395From Massimo Mancini:
1396
13971. Constraint not available time slots for a teacher
13982. I put a name in filter and I see there's any constraint of this kind on
1399that teacher
14003. Then I press Add. I expect the teacher field filled with the name I used in
1401filter... but currently FET propose always the first teacher in list.
1402
140384---------------------------------------------------------
1404From Massimo Mancini and Chafik Graiguer:
1405
1406Consider this:
1407
14081. the max num of hours for day is 5 for ALL teachers, the max num for teacher X is 3: this
1409works
1410
14112. the max num of hours for day is 4 for ALL teachers, the max num for teacher X is 5: this
1412NOT works as expected. FET simply refuse the exception. The exception does
1413not override the global in any case.
1414
1415I remember we discussed this "strange" logic (imho an exception is an
1416exception and always override a global condition) last year, it seems that
1417the workaround is to manage this scenario using only individual constraints
1418(isn't it?), very tedious. If so I suggest a button in the form of global
1419constraint to automatically generate all the individual constraints one
1420needs.
1421
1422From Chafik Graiguer (same subject):
1423
1424My suggestion was not only about adding a teacher one by one
1425It is about get rid of double menu entries
1426For example, for Teachers and students, and for every constaint, FET has double entry like this:
1427-Max days per week for a teacher
1428-Max days per week for all teachers
1429-Min days per week for a teacher
1430-Main days per week for all teachers
1431...etc
1432My idea is to make a single entry for any constraint like this :
1433-Max days per week for teacher (s)
1434
1435-Min days per week for teacher (s)
1436
1437This has another advantage:
1438user will be presented by a window like described in my screenshot, where he can press Add all button
1439Now suppose, like user X, that I have 50 teachers or 50 student sets
1440I can easily add them all into Min days per week =5
1441then on the right pan double click on 5 teachers to deselect them before clicking Add constraint
1442Then add another Min days per week =3 for those 5 teachers !!
1443If we have tags for teachers (and rooms) it will even more easier
1444
1445This concept is already used in FET in two places:
1446- Set all available, set all not available
1447- subject has a set of prefered rooms
1448
1449See also TODO item #82.
1450
145185---------------------------------------------------------
1452From Massimo Mancini:
1453
1454Consider the form that lists the constraint "teacher non available":
1455change the line format from DESC CONSTRAINT + TEACHER'S NAME to
1456TEACHER+CONSTRAINT or, better, codify description of constraint using some string of
1457fixed size like so:
1458
1459HTNA - NAME .....
1460
1461I know the problem of translation (you may omit the description at all, it is
1462useful only when you display ALL constraints), but I think that a code is less boring
1463than a long and incomplete description repeated at beginning of all lines.
1464
146586---------------------------------------------------------
1466From Andres Chandia (on forum):
1467
1468Is there a way to tag teachers, for different purposes like, a group of teachers can only work in the morning, or an activity can only be given by a
1469teacher of certain group, etc.
1470
147187---------------------------------------------------------
1472From Massimo Mancini:
1473
1474a problem that we discussed in the past is about the description of
1475constraints (specially in the list of constraints or in the list of
1476conflicts): they are too long.
1477You must well understand that the unlucky timetable maker need to see the
1478troubles at a glance: reading long sentences with absolutely redundant
1479parts is very difficult and time consuming.
1480This is a problem in english but the solution can be achieved also and only in
1481translations... (a buon intenditor...;-)
1482
1483So in the following you will find an example of that I think is a good list.
1484Of course is only my opinion. But, trust me, is a useful one
1485
1486----- NOW --------------------------------------------------
1487
1488Conflitti lievi totali: 13.7
1489Elenco dei conflitti leggeri (in ordine decrescente):
1490Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 290 (I:PANS, M:FRA, S:AMM_1 B) è in conflitto con l'attività con id= 289 (I:PANS, M:FRA, S:AMM_1 B), essendo 1 giorni troppo vicine, nei giorni Martedì e Martedì, incremento dei conflitti= 0.99. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno
1491Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante DIRU il giorno Mercoledì durata=5.  Questo incrementa la conflittualità di 0.99
1492Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante GADO il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
1493Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante MALG il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
1494Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante MESS il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
1495Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante OSIO il giorno Lunedì durata=5.  Questo incrementa la conflittualità di 0.99
1496Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante POLE il giorno Venerdì durata=5.  Questo incrementa la conflittualità di 0.99
1497Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante PULI il giorno Mercoledì durata=5.  Questo incrementa la conflittualità di 0.99
1498Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante RAPE il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
1499Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante xAZ1 il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
1500Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 416 (I:LUCH, M:DIR, S:IGE_2 C) è in conflitto con l'attività con id= 415 (I:LUCH, M:DIR, S:IGE_2 C), essendo 1 giorni troppo vicine, nei giorni Sabato e Sabato, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno
1501Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 521 (I:LUZZ, M:EAZ, S:IGE_5 A) è in conflitto con l'attività con id= 517 (I:LUZZ, M:EAZ, S:IGE_5 A), essendo 1 giorni troppo vicine, nei giorni Martedì e Martedì, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno
1502Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 617 (I:xAZ2, M:EAZ, S:IGE_3 B) è in conflitto con l'attività con id= 615 (I:xAZ2, M:EAZ, S:IGE_3 B), essendo 1 giorni troppo vicine, nei giorni Sabato e Sabato, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno
1503Vincolo di tempo infranto Numero minimo di giorni tra attività: l'attività con id= 718 (I:CARU, M:COS_DIS, S:GEO_3 A) è in conflitto con l'attività con id= 715 (I:CARU, M:COS_DIS, ChA:info4, S:GEO_3 A), essendo 1 giorni troppo vicine, nei giorni Sabato e Sabato, incremento dei conflitti= 0.95. Le attività sono collocate consecutive nell'orario, perchè hai scelto questa opzione nel caso che esse capitassero nello stesso giorno
1504
1505----TOMORROW I HOPE ()IMHO)-------------------------------------------------
1506
1507Conflitti lievi totali: 13.7
1508Elenco dei conflitti leggeri (in ordine decrescente):
1509VT: Num.min.gg, tra attiv.: AttID= 290 (I:PANS, M:FRA, S:AMM_1 B) vs. AttID= 289 (I:PANS, M:FRA, S:AMM_1 B): +1 Mar -Mar : +0.99
1510VT: Num.max. 4 h consec. :  DIRU : Mer : 5 : +0.99
1511VT: Num.max. 4 h consec. :  GADO : Sab : 5 : +0.99
1512VT: Num.max. 4 h consec. :  MALG : Sab : 5 : +0.99
1513VT: Num.max. 4 h consec. :  MESS : Sab : 5 : +0.99
1514VT: Num.max. 4 h consec. :  OSIO : Lun : 5 : +0.99
1515VT: Num.max. 4 h consec. :  POLE : Ven : 5 : +0.99
1516VT: Num.max. 4 h consec. :  PULI : Mer : 5 : +0.99
1517VT: Num.max. 4 h consec. :  RAPE : Sab : 5 : +0.99
1518VT: Num.max. 4 h consec. :  xAZ1 : Sab : 5 : +0.99
1519VT: Num.min.gg, tra attiv.: id.416 (I:LUCH, M:DIR, S:IGE_2 C) / id.415 (I:LUCH, M:DIR, S:IGE_2 C): +1 Sab-Sab : +0.95
1520VT: Num.min.gg, tra attiv.: id.521 (I:LUZZ, M:EAZ, S:IGE_5 A) / id.517 (I:LUZZ, M:EAZ, S:IGE_5 A): +1 Mar-Mar : +0.95
1521VT: Num.min.gg, tra attiv.: id.617 (I:xAZ2, M:EAZ, S:IGE_3 B) / id.615 (I:xAZ2, M:EAZ, S:IGE_3 B): +1 Sab-Sab : +0.95
1522VT: Num.min.gg, tra attiv.: id.718 (I:CARU, M:COS_DIS, S:GEO_3 A) / id.715 (I:CARU, M:COS_DIS, ChA:info4, S:GEO_3 A): +1 Sab-Sab : +0.95
1523
152488---------------------------------------------------------
1525From Volker Dirr:
1526
1527students set max gaps per week
1528and
1529students set begins early
1530
1531need a filter/checkbox show only O year O group O subgroup
1532because there are so many students (subgroups) and it is useful to add
1533that counstraints for lower years. but the list is so long, so it is very
1534difficult to find the years.
1535
1536that filter is also useful for students set not available.
1537
153889---------------------------------------------------------
1539From Paolo (on forum):
1540
1541Well, for me it would be very very (very) important thinking over the constraints while fet is working.
1542
1543So i ask, kindly, if it is possible getting a print function of all constraints (at least of time constraints).
1544
1545Liviu: A temporary solution would be to open two FET programs simultaneously.
1546
154790---------------------------------------------------------
1548From daviodan:
1549
1550Possibility to edit the timetable after generation, drag-drop of activities.
1551
155291---------------------------------------------------------
1553From Yush Yuen:
1554
1555Sometimes we have 3 teachers available to teach the same "kind" of
1556class. For example, Teacher A, B C may teach either one of Math for
15577A, 7B, and 7C. It is possible that one combination may yield a
1558timetable that is easier than another. So, it would be nice if we can
1559have an option to generate "alternative" scenarios with the different
1560combination.
1561
1562A possible way to do that may be:
1563- adding a "teachers-activities pool" dialogue.
1564- activities of the same pool may swap teacher
1565- each pool may be enabled or disabled at timetable generating time
1566(you may not need all combination all the time)
1567- all generation time, make an option for "generating alternatives"
1568and save each alternative in a different folder or something
1569
1570Or:
1571- activities are created without teachers
1572- adding a "teacher can teach: activity tag" dialogue
1573- at generation time, teachers are assigned to activities based on
1574which teacher has the right "teacher can teach tag"
1575
1576Or, another way of doing this (perhaps a more elegant way) is to make
1577a "preferred teacher" constraint like the preferred room constraint.
1578However, also add an "same room/teacher" option. That is, room/teacher
1579may be selected from list of preferred rooms/teachers, however, the
1580same room/teachers must be assigned to the same activities.
1581
158292---------------------------------------------------------
1583From Silver (on forum):
1584
1585Constraint "Min gaps between activities in the day for teacher".
1586I mean like this :
1587when I select Min gaps = 2
1588Saturday: activity - gap - gap - activity - gap - gap - activity
1589
159093---------------------------------------------------------
1591From George Miliotis (on forum):
1592
1593I think the ability to renumber the IDs of the activities starting from a specific ID would be very useful in other XML-related work, too.
1594
1595An advanced option: "renumber activities" with a dialog asking for "new lowest ID" would be ideal for these merge-split issues.
1596
1597In this case we could renumber the first FET file from 1, the second from 1000, then copy paste directly into the XML file.
1598
1599This would get all rules and activities, wouldn't it?
1600
1601But maybe we could use XSL for this.
1602
160394---------------------------------------------------------
1604From aang (on forum):
1605
1606I have a problem though in the formatting of the html files and consequently the printing. Now, an activity will be printed with six subgroups on the timetable
1607making it unusually wide(or tall) and the subgroup names do not actually reflect the student set that should be displayed e.g Mwaniki-CRE-4 E BIOCRE1, 4 E PHYCRE1,
16084 W BIOCRE1, 4 W PHYCRE1, 4 N BIOCRE1, 4 N PHYCRE1, 4 S BIOCRE1, 4 S PHYCRE1
1609instead of Mwaniki-CRE-4 CRE1 or Mwaniki-CRE-4. This means i edit the timetable manually after every generation to make this changes. I suggest adding a displayname
1610tag to the activity which defaults to the current display name (without the activityID) and using this to determine what is displayed for the activity.
1611
1612Another thing, for activities with same starting time, is it possible to have them in one column/row so that the number of rows/columns is fixed to the either the number
1613of days or lessons (depending on the selected timetable)? This way it is easier to print.
1614
161595--------------------------DONE---------------------------
1616
161796--------------------------DONE---------------------------
1618
161997---------------------------------------------------------
1620From liquid (on forum):
1621
1622Based on what I experience while creating not an easy timetable I would do suggest to enable more categories than 3. Max number of categories I need years to split to is 7. I do it manually at the moment but it is time and mind consuming. I know it might seem unusual however requirements for the timetable are indeed real not theoretical.
1623
1624Liviu: Too many categories might slow down the generation and consume too much memory (there will be many empty subgroups). Anyway, anybody can consider as many categories as needed, by adding groups/subgroups manually or using another program to generate the .fet XML file.
1625
1626liquid: I'd like to mention something that might be worth to consider. As we said earlier we can always make our own division of the year to groups and subgroups which are going to be most suitable to one's needs. It would be good to have the possibility to delete unused (empty) subgroups from all groups. Now, FET kindly informs us that a subgroup belongs to another group and you have to delete it again and again from every other group.
1627
1628Update: The maximum number of categories now is 4.
1629
163098------------------------DONE-----------------------------
1631
163299-------------------------DONE----------------------------
1633
1634100---------------------------------------------------------
1635From Chafik Graiguer (on forum):
1636
1637I spent much time striving to solve an impossible timetable
1638I wonder if FET can automatically report it impossible then abort
1639-First case: a teacher having only 5 hours per week: 1+1+1+2 (Min days between activities=1)
1640With Min hours per day for teachers = 2
1641This lead for an impossible timetable, but FET desperately trying to solve it for hours and hours
1642
1643-Second case:
1644A teacher has 15 hours
1645
1646With a maximum of 4 hours per day, given a 6 days week, this would allow him 1 free day or even 2 free days (4+4+4+4)
1647But activities were split in a rather strange fashion
1648Group G1: 3+3
1649Group G2: 2+2+2+3 (Min days between activities = 1)
1650Activities from G1 alone would occupy him for 2 days
1651Then come activities form G2 which require additional 4 days
1652Total is 6 days !!
1653I set Max days per week = 5
1654This leads to yet another impossible timetable
1655
1656My question: can FET automatically report it impossible then abort?
1657
1658101---------------------------------------------------------
1659From drew:
1660
1661Actually the biggest problem was with teacher T1, who was mistakenly scheduled for 7 activities with activity AT1. But, there are only 6 timeslots available for AT1. FET needs a way to detect and report on this kind of error. This is not the first time I made that kind of mistake.
1662
1663After I deactivated activity id 1, a problem with teacher T2's not available times. Instead of marking him not available for the first two AT1 time slots on Saturday afternoon. After I relaxed it to him just being not available for the 1st time slot FET was able to create a schedule.
1664
1665I'm not sure how you in on T2's not available time slot as the cause of the problem. I think you need to try to find a way to automate that process and generate warnings about which constraints need to be relaxed.
1666
1667The problem with activity id 2 was a variation on this problem. T2 had 5 activities for tag AT1, AT1 has 6 preferred time slots, but T2 was unavailable for 2 of them.
1668
1669You do similar checking for student groups which have too many activities for the available time slots.
1670
1671102---------------------------------------------------------
1672From Christian Kemmer:
1673
1674I have another suggestion which would make things easier for me.
1675When defining time constraints for activities, I can choose a group of students, let's say "year 05". But no activity belongs to this group, because all activities belong to subgroups of that group, let's say "class 05A" or "class 05B". So choosing a group in those dialogs has no effect for me.
1676What I really want to do is to define constraints for some activities that all belong to subgroups of a special group, for example all lessons in a certain subject of all classes in "year 05". I cannot use the "choose group"-combo-box at the moment, but I have to use the "subject" or "teacher" combo-boxes. If I use subject, I also get a lot of activities from other years, if I use teacher, I also get those other activities, and I have to change the teacher for each activity I am searching for.
1677
1678My suggestion is that there is a checkbox "show subgroups of group" with the following effect:
1679If I choose a group and activate that checkbox, all subgroups of that group are also shown.
1680So if I choose "year 05" and subject "physics", all activities with subject "physics" in all subgroups like "class 05A", "class 05B", ... of group "year 05" are shown.
1681If I only choose the group and activate that checkbox while leaving the other comboboxes blank, all activities of all subgroups of that group are shown.
1682
1683103---------------------------------------------------------
1684From Silver (on forum):
1685
1686He needs a constraint to ensure that all activities of each teacher are hosted in different rooms (for exam scheduling).
1687
1688104---------------------------------------------------------
1689From Davide G. M. Salvetti (on forum):
1690
1691Would it be possible to sort on comments the activities list (like sorting the constraints)?
1692
1693105---------------------------------------------------------
1694From Davide G. M. Salvetti (on forum):
1695
1696I wonder if it's sensible to write a .fet file with all placed activities time and space constraints spelled out (i.e., just like the usual
1697_data_and_timetable.fet, where each activity is (non permanently) blocked in time and space) even when FET gets interrupted, rather than only
1698if it completes succesfully.  I think it could be useful, because that file could then be reused as a start, maybe manually deleting or adding
1699some constraint.
1700
1701106---------------------------------------------------------
1702From Silver (on forum):
1703
1704He needs "teachers_rooms.html" in the statistics folder, he thinks it would be useful for the examination timetable.
1705
1706107---------------------------------------------------------
1707From Horatiu Halmajan and Yush Yuen:
1708
1709They suggest the possibility of selecting more constraints in the all time/space constraints dialogs and
1710de(activate)/remove them in a single operation.
1711
1712108---------------------------------------------------------
1713From skinkone (on forum):
1714
1715What I realized is that FET won't allocate your students for you, so I will do that by hand. I can only suspect that such a problem increases the
1716complexity exponentially. However, if you are thinking of going down this road in future developments, I would vote in favor of having such a
1717feature where students can have "tag preferences". The user would set "minimum or maximum number of tags a student group must have". This would
1718then be an optimization problem to try to get the most students with their preferences. Essentially FET would form student groups as an output
1719rather than as an input.
1720
1721109---------------------------------------------------------
1722From Jonathan Block (on forum):
1723
1724It would be nice to have a fourth dimension.
1725
1726Explanation from Liviu Lalescu: He considers students (1), teachers (2) and rooms (3) as three dimensions. He would like to allocate activities
1727to teachers (4) (and these teachers should be the fourth dimension, different in concept from the second dimension, but similar to the third dimension).
1728
1729110---------------------------------------------------------
1730From Liviu Lalescu:
1731
1732Possibility (check box, default checked) of safe saving for File/Save and Save as. Maybe even for Timetable/Save data and timetable as.
1733
1734Safe saving means: create a temporary file (make sure it is truncated), write the data to it, remove the original file and rename the temporary file to the original file.
1735
1736111-------DONE since FET-5.35.0-(21 December 2017)----------
1737
1738112---------------------------------------------------------
1739From murad:
1740
1741Create please, in QComboBox, auto-complete. With a large number of students and teachers it is very difficult to find the necessary students or teachers.
1742
1743113---------------------------------------------------------
1744From kdrosos:
1745
1746In FET there is "School's name", where the school's name appears in the final .html files.
1747
1748Maybe the text "School's name" can be parametric and thus to allow changing to "Department's name" or "Institution's name" etc.
1749
1750This can also allow a "School's name field" as:
1751
1752"Faculty of FET: Department of FET"
1753
1754Liviu's note: I think that kdrosos refers to the Greek FET. In the English FET, the string is "Institution name".
1755
1756114-------DONE since FET-5.40.0-(20 September 2019)--------
1757
1758115---------------------------------------------------------
1759From nouvakis:
1760
1761I've seen that with html files you save a "xxx_data_and_timetable.fet" file.
1762In this xml file, you save
1763<Time_Constraints_List> element which contains many <ConstraintActivityPreferredStartingTime>.
1764
1765These <ConstraintActivityPreferredStartingTime> elements are the generated timetable data (Activity_Id, Preferred_Day, Preferred_Hour).
1766
1767So, you could add an option (for example autosave) saving each generated timetable with a unique name (for example name_year_month_day_hour_minute.fet)
1768
1769This file could easily be loaded from a user just to be able to preview the generated timetable inside FET.
1770
1771116---------------------------------------------------------
1772From nouvakis:
1773
1774I would like to suggest an extra optional field to entities of FET program.
1775
1776For example:
1777Teachers_List: name, [id]
1778Students_List: name, [id]
1779Subjects_List: name, [id]
1780Hours_List: Name, [id]
1781Days_List: Name, [id]
1782
1783etc
1784
1785When someone (like me) would like to import FET generated timetable data to another program,
1786there should be a more accurate way to associate an FET entity with my database records beside the name ...
1787
1788If you add the id field (as an optional field) there should be no problem to users already using FET ...
1789
1790117---------------------------------------------------------
1791From mma:
1792
1793When adding a constraint, a useful feature would be to check if an identical constraint exists already, and thus not adding the constraint. I just tried to add the same constraint repeatedly (just kept pressing 'Add'), and it kept adding. When there are many constraints it can be difficult to keep track of them all.
1794
1795Removing identical constraints reduces the clutter, and perhaps also speeds up the timetable generation?
1796
1797118------------------------DONE-----------------------------
1798
1799119---------------------------------------------------------
1800From Yush Yuen:
1801
1802For printing: It would nice if I can specify a custom css file for the style.
1803
1804120---------------------------------------------------------
1805From Yush Yuen:
1806
1807I find that while the fixed max-room contraint works well, I notice
1808something with my situation:
1809
1810I have a teacher, teacher A, uses room A and teaches year 6 classes. Unlike
1811the more senior years, which are heavily blocked (lots of constraints with
1812activities with same start time), year 6 classes are pretty free floating.
1813Therefore, the year 6 classes always appear at the end of the order of
1814allocation.
1815
1816I have included room A as one of the available rooms for the preferred room
1817list for another teacher. room A is almost always chosen. But the problem
1818is, teacher A and room A become very difficult toward the end of the
1819allocation. My timetable has about 1280 activities, and most of the year 6
1820classes are toward the end of the list. The generation always got stuck
1821toward the end, like 1250, with teacher A not being able to get the right
1822allocation.
1823
1824I don't think this is a bug. This is easily solved by removing room A from
1825the preferredRooms list for that other teacher. But I just want to point
1826that out to you.
1827
1828Answer Liviu Lalescu:
1829
1830I could improve the algorithm to take care of situations like that. So
1831it will know that in room A there can be only one type of activity
1832(one type of look-ahead). Or that in room A there can be only teacher A
1833(another type of look-ahead). But there are contrary reasons:
1834
18351) Will make other timetables slower, by the additional look-ahead.
1836
18372) Each look-ahead is to be avoided, because of possible new critical
1838bugs and general slowdown. There are many look-aheads in FET, but they
1839are necessary and not very time-consuming.
1840
18413) The user is advised to help FET towards a solution. The user needs
1842to collaborate with FET. (Of course, not necessarily us. We want to
1843push its limits )
1844
18454) This is the most important reason. Say I solve this problem for a
1846single preferred room for teacher A. But this is not everything. A user
1847may invent two preferred rooms for teacher A and go into the same
1848situation, which now becomes more complicated to manage. I cannot
1849forecast all situations similar to yours.
1850
1851Please tell me what you think, I might need to treat situation like
1852these - I am still thinking. Because I did many look-aheads which are
1853necessary.
1854
1855121---------------------------------------------------------
1856From Andres Chandia:
1857
1858He has a custom version, developed by Liviu Lalescu, which among other things
1859ensures that if more people open the same file (on a common server), only the first
1860one who opened it will be able to save it, and the others will see that their file
1861is read-only. He suggests to add this into official FET. But it might be tricky and
1862potential bugs might be critical.
1863
1864122---------------------------------------------------------
1865From Robert Sutcliffe:
1866
1867I need to print out all the rules and constraints to document the settings to supply to another system, and for peer review.
1868Staff availability, activities, room allocation rules, not-overlapping activity selections - everything!
1869Is there any way to do this?
1870---Answer Liviu Lalescu: no, there is no direct way in FET---
1871If not, another web report that details all these settings would be ideal.
1872
1873123---------------------------------------------------------
1874From Zsolt Udvari:
1875
1876I think the following feature would be nice: when I deactivate a year FET should deactivate some time constraints, e.g. min hours daily for a student set.
1877When I deactivate a year and I want to generate timetable, FET says that some groups don't have enough activities to respect this constraint.
1878
1879And when I activate a whole year these constraints will again be activated.
1880
1881Answer Liviu Lalescu:
1882
1883The best would be other buttons: "Activate/deactivate all constraints for selected students year" and so on, for groups, teachers, etc.
1884Because the button says "Activate/deactivate all activities for selected students year" (it refers only to activities).
1885
1886124---------------------------------------------------------
1887From rjmillett (on guest book):
1888
1889there are many things i would like to have in FET:
1890
18911. when adding activities there should be a choice list similar to the new print option now included in 5.18
1892
1893to add multiple classes (sub-groups) with the same choice of periods and teacher in one click i.e. all same
1894
18952. there should be a similar option in the preview to choose a class and teacher preview both at the same time so as to make changes without having to go back and every time i.e. side by side view at one time click in drop down box
1896
18973. to right click in the preview and change the position ot LT or PLT activities and not having to go back every time to time > all > search > etc to make changes
1898
18994. print preview choice button on main panel
1900
19015. un/lock buton on main panel
1902
19036. an import and export to EXCEL or txt other than CSV file
1904
19057. print option of teachers statistics on preview not from HTML
1906
1907In addition to (6.), when Liviu said that Excel was not free software, rjmillett replied:
1908
1909Another option would be to export as a Google sheet that's open source and
1910free for all other than Microsoft's excel
1911
1912125---------------------------------------------------------
1913From Volker Dirr and Bobby Wise:
1914
1915Bobby:
1916
19171) I have a situation where a school has 3 Grade 11 classes. 11a, 11b and 11c.
1918
1919All the classes have compulsory subjects: 7 Periods of English, 7 periods of
1920second language (Afrikaans, French and German) and 8 periods of Mathematics.
1921
1922Then each student must select 1 subject from each of the combinations below:
1923
1924
1925Combination 1 (6 Periods)
1926
1927Accounting
1928
1929Biology
1930
1931History
1932
1933Science
1934
1935
1936Combination 2 (6 Periods)
1937
1938Art
1939
1940Biology
1941
1942Economics
1943
1944Science
1945
1946
1947Combination 3 (6 Periods)
1948
1949Art
1950
1951Biology
1952
1953Geography
1954
1955Science
1956
1957
1958They also have 2 remaining subjects of 1 period each Life Skills and
1959Religious Instruction.
1960
1961
1962They have a 7 day cycle and 6 periods in each day.
1963
1964
1965Could you please recommend a manner in which I should split the classes in
1966order to make it possible for all the subject choices?
1967
1968
19692) Thanks Liviu, Volker did help while you were away so I have sorted out the
1970problem.
1971
1972What I also discussed with Volker was the possibility of a forth category
1973split. I know it will slow down the generation but for me that is not too
1974much of a problem. I suggested that perhaps in the Settings Parameters you
1975should put an option so the user can decide if they would like a 4th
1976category or not. Then obviously they should realize if they do select the
1977option that the generation process will be much slower.
1978
1979
1980Volker:
1981
1982i had several talkings about the number of categories now again.
1983
1984what do you think about the following suggestion:
1985
1986add in the settings a integer "max number of subgroups for split year
1987automaticly".
1988
1989by that idea it is much much flexible in the number of categories and
1990the number of splits per category.
1991
1992so you can increase/change as long as you are not over that limit.
1993
1994the current limit is 12*6*6=432.
1995i think setting the limit to 500 is ok.
1996
1997we maybe also allow the user to increase that limit a bit more, but of
1998course only with the warning that it will be slow, produce large html
1999files and doesn't make sence if it is (much) greater then "real"
2000students per year.
2001
2002126---------------------------------------------------------
2003From Volker Dirr:
2004
20051)
2006>> i just want to tell you this and ask you if we maybe need that also
2007>> in FET.
2008>>
2009>> i am currently coding on an other small tool.
2010>>
2011>> i saved settings with QSettings and i reload that settings on an other
2012>> function.
2013>> the strange thing was this:
2014>> i saved QSettings in the destructor ~xxx and reload it in an other
2015>> function/file again, but it look like Qsettings didn't save. the
2016>> strange things was that visible/correct as soon as i restarted that
2017>> reload function a bit later.
2018>> first of all i tried a QSettings.sync(), but it doesn't help.
2019>> i also tried with a global variable, but it also doen't help.
2020>> it look like my "update"-function already run before the destructor
2021>> source was done.
2022>>
2023>> now i removed the destructor ~xxx and replaced it by a protected: void
2024>> closeEvent(QCloseEvent *event);
2025>>
2026>> now all work fine. it look like the protected: void
2027>> closeEvent(QCloseEvent *event); wait long enough.
2028>>
2029>> so a destructor run simultaneously? so it is critical to use
2030>> destructors with qt, because they might be to slow? (for example if
2031>> you clear variables, reload variables or something like that.)
2032
20332)
2034i am not sure if it is a problem.
2035
2036it was more an information to you.
2037
2038i was able to proove that the destructor is doing his job, but to slow. the
2039destructor isn't ready if the function go back to the main programm.
2040if i add a delay in the main programm and check if the destructor have
2041done his work, then it is ok. but without that delay it isn't ok. so
2042destructor is slow (i guess it simply run in a second thread
2043simultaniously).
2044
2045so the solution is:
2046a) adding a delay in main code. (but that is a bad style, especialy because
2047i don't know how long it must be)
2048b) coding it with an closeEvent. (like in qt book). i coded it with
2049closeEvent and it run very fine now.
2050
2051i just didn't check if this is maybe also critical for fet. that is why i
2052just want to warn you, because it took several hours to find this bug.
2053
2054Liviu:
2055
2056I think I understood.
2057
2058You are right: "The readSettings() and writeSettings() functions must
2059be called from the main window's constructor and close event handler as
2060follows:" (from http://qt-project.org/doc/qt-4.8/qsettings.html#details)
2061
2062I wanted to say: "For efficiency, the changes may not be saved to
2063permanent storage immediately. (You can always call sync() to commit
2064your changes.)", but looks like you already checked that.
2065
2066I think that if the control goes to user interface (like waiting for
2067user to click), the critical time is gone. So, I hope your situation
2068will not appear.
2069
2070I really cannot do all perfectly with closeEvent. There are too many
2071files. Maybe in the future.
2072
2073127---------------------------------------------------------
2074From Volker Dirr:
2075
2076Lift the limits for the generation algorithm, like MAX_TEACHERS and
2077MAX_TOTAL_SUBGROUPS.
2078
2079128---------------------------------------------------------
2080From yasin dehghan:
2081
20821- show warning message when enter 2 same activity
20832- add exam date with subject in subject form
20843- add list for teacher to show allow subject for each teacher in techer form
2085
2086Liviu Lalescu:
2087
2088I will add your suggestions in the TODO, but please explain to us more
2089detailed:
2090
20911 - When the user adds two same SPLIT activities?
20922 - I do not understand.
20933 - I think you mean each teacher has his own subjects list?
2094
2095yasin dehghan:
2096
20971- no, don't split. when the user add 2 same activity show warning msg and
2098don't save 2nd activity
2099
21002- user able to add date of exam for each subject and print exam date with
2101subject name, just it, no exam planing and etc
2102
21033- yes, user able select list of allow subject for teacher, when add
2104activity, only allow subject show for teacher or show warning msg if select
2105don't allow subject
2106
2107and other sugestion
2108
21094- user able enter min and max hour of each teacher per week and show this
2110min and max hour in teacher statiscal foe compare
2111
2112129---------------------------------------------------------
2113From Volker Dirr:
2114
2115do following speed check:
2116
2117check all connections of radio buttons.
2118check if they use singnal toggled.
2119
2120if you can see 2 times the same slot, then it is bad to use toggled.
2121example:
2122this is bad:
2123connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something(bool)));
2124connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something(bool)));
2125
2126this is ok:
2127connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something1(bool)));
2128connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something2(bool)));
2129
2130if you can find a bad version, then it should be converted into this:
2131connect(radioButton1, SIGNAL(clicked(bool)), this, SLOT(something(bool)));
2132connect(radioButton2, SIGNAL(clicked(bool)), this, SLOT(something(bool)));
2133
2134reason:
2135if you click a button in bad example, then something is called twice!
2136(once, because one RB is checked and a second time, because the other RB
2137is unchecked).
2138if you use click, then something is called only once.
2139
2140130---------------------------------------------------------
2141From Daniel (on forum, see https://lalescu.ro/liviu/fet/forum/index.php?topic=1224.0):
2142
2143Allow activities to span over breaks. (For the moment, a solution is to split activities
2144and add constraints two (or three) activities grouped. Another solution is to not
2145consider explicitly the breaks in the timetable, but this way the constraints of
2146type max hours continuously may not work as needed.)
2147
2148131---------------------------------------------------------
2149From daviodan:
2150
2151After clicking 'Add' in the add activity dialog, he suggests that the students list
2152widget should be cleared, because usually the user adds activities for a specific
2153teacher (with all his students), then goes to another teacher.
2154
2155132---------------------------------------------------------
2156From Massimo Mancini:
2157
2158Display the total number of hours of an activity: when I divide an activity
2159I would see the total of durations of all defined subactivities.
2160This total must be updated changing the number/duration of subactivities.
2161
2162A good place for this changing label could be near number of sub in
2163group *divide*:
2164
2165In my mind (italian one) I know that a teacher have 6 hours of a subject,
2166only then I think about how divide them.
2167See the total expedite and reduce input errors.
2168
2169---
2170
2171comment by Liviu Lalescu:
2172
2173I added this in the TODO. But there is so little space in the dialog there.
2174
2175---
2176
2177comment by Massimo Mancini:
2178
2179I think the space is pretty enough. There are two suitable places:
2180
21811. at the side of the field *divide* (too long, what is the max number of
2182subactivities? 9, 99, 999?)
2183
21842. below the check *consecutive*
2185
2186the format of the label can be as little as T:xxx (5 chars).
2187
2188Just this afternoon I spent 2 hours correcting mistakes that I would have
2189avoided if such counter was in place. Consider the input of a sequence of activities with
2190similar number of subactivities  but different duration of some sub, consider also that the
2191tab widget remember the past durations when you reduce and then re
2192increases the number of subs... so. it's easy (too easy) to insert a wrong total
2193duration, for a real check you must tab all the subs and add: very boring.
2194
2195133---------------------------------------------------------
2196From Massimo Mancini:
2197
2198First, consider this situation...
21991. I'm working on teachers not avalaible (TNA) constraint
22002. I filter on MANC, fet show a blank windows: the constraint on MANC not
2201exist.
22023. Good. I add it but the dialog not inherit MANC as selected teacher :-(
2203why? In general the dialog add/modify is not linked with existing constraints. Fet
2204prevents, of course,  multiple TNA about the same teacher, but I ask you, is it
2205possible to link the dialog with existing data?  in this manner the
2206add/modify functions would be the same. With the wheel of the mouse I can
2207scroll the list of teachers and quick view/modify the existing constraint!
2208
2209Second, the comment area. I use it to note some info about the
2210contents of fet file. I would like to access the comment
2211space more quickly. My suggestion is "reduce the RECENT button and put near
2212a COMMENT button"
2213
2214NEW	OPEN
2215RECENT	COMMENT
2216SAVE	AS
2217
2218good! isn'it? ;-)
2219
2220The best would be if you could show the first line of the comments along with
2221the file name in the recents list... so I would avoid to remember...
2222
2223134---------------------------------------------------------
2224From Pietro (on forum):
2225
2226I think would be nice we could enable/disable constraints even in the filtered masks
2227(ex: "constraints teacher not available times" mask), and not only in the "all time
2228constraints" mask. The "comments" button would be very useful too.
2229
2230135---------------------------------------------------------
2231From Pietro (on forum):
2232
2233I would suggest one more feature:
2234it would be very useful to have shortcuts with "ALT or CTRL + key" for the buttons in the various masks all over the FET.
2235So we could for example enable, disable or delete the various constraints without have to use the mouse, only the keyboard.
2236
2237136---------------------------------------------------------
2238From arivasm (on forum):
2239
2240I think it would be good if the activities dialog would be actualized every
2241time you enter a new one. That could allow to verify the last entered, and
2242prevent mistakes, without the need to close the new activity dialog.
2243
2244137---------------------------------------------------------
2245From Pietro (on forum):
2246
2247I think the "pseudo activities" shouldn't be shown in the teacher statistics, or
2248should be shown in a separate column. Infact, with actual situation the user can
2249confuse real activity with pseudo one and don't know the real situation.
2250
2251138---------------------------------------------------------
2252From Massimo Mancini:
2253
2254If you close and reopen FET, the central tab widget remain on the tab it
2255was when you terminated the program.
2256When FET start, the focus should be always on the File tab.
2257
2258139---------------------------------------------------------
2259From Massimo Mancini:
2260
2261Please consider to implement a shortcut (Alt+C ?) to popup the comment area...
2262
2263140---------------------------------------------------------
2264From arivasm (on forum):
2265
2266When you set the constraints of the times in which the teachers are not available,
2267maybe you don't know how many teachers wil be finally available for each time slot
2268(unless you count them manually). So, my suggestion is to include a new statistic
2269to show that information, in order to correct impossible constraints before start
2270the timetable generation. Of course, an authomatic detection (less teachers
2271available than needed) would be better!.
2272
2273Liviu Lalescu: Sorry, but I do not understand. I already do a check on the number
2274of activities for each teacher, versus his not available times.
2275
2276Volker Dirr: Your suggestion isn't that easy as you might think now. It's easy if
2277teacher/students have full timetables (all timeslots are used), but it's complicated
2278if the tables are not full.
2279
2280Liviu already include common checks like that. The checks also need to care about
2281timetables that are not full (not all timeslots are used). Maybe the checks can be
2282improved if the timetables are full, but that mean: a) you must code a check that
2283check if the timetables are full. b) it will help only a few datasets, because most
2284datasets (compare examples) don't have full timetables.
2285
2286arivasm: Excuse me if my previous post wasn't clear!
2287
2288Of course, Volker is right: it will be a weak information know how many teachers are
2289available for each time slot if the timetable isn't full. Furthermore, the fact to
2290have for each of all time slots more teachers than groups don't will guarantee that
2291the whole problem will be solvable. But if the timetable is full, and this condition
2292fails at some time slot, it will be certain that the problem will be impossible to solve.
2293
2294The idea arose when I was entering the preferences of my workmates and I suspected that
2295too many of them were requesting be free at some times, i.e. last class of friday
2296(of course!). Then I missed to have a simple account as an alternative in order to avoid
2297passing sheet after sheet, looking for the petition and count them.
2298
2299141---------------------------------------------------------
2300From AZ (on forum):
2301
2302I would appreciate a statistical feature that tells the user which constraint(s) is (are)
2303causing the greatest number of rejects; if a user could see, during computation, a counter
2304that tells him the top 10 blocking constraints, maybe the debugging could be easier.
2305I don't know if it's possible, though.
2306
2307Liviu Lalescu: Unfortunately, it is probably impossible or it would give wrong results.
2308But someone should study this suggestion, so I'm adding it in the TODO.
2309
2310142---------------------------------------------------------
2311From Etlau (on forum):
2312
2313Maximum delta in time for day per week per group. For example 7-7-3-4-5 is unacceptable,
2314better will be 5-5-5-5-6. And same for teacher. Yes, you can set max and min activities
2315per day, but number need to calculate manually for every class and teacher, not really
2316comfortable.
2317
2318143---------------------------------------------------------
2319From Etlau (on forum):
2320
2321Will be nice to click-and-drop and lock activities in shedule directly.
2322
2323144---------------------------------------------------------
2324From Etlau (on forum):
2325
2326Add "start student day" for activity, like "end student day"
2327
2328Liviu Lalescu: I'll add this in the TODO. But if students begin at first hour,
2329add preferred times for the activities in the first hours.
2330
2331145------------DONE since FET-5.41.0 - 2019-11-20-----------
2332
2333146---------------------------------------------------------
2334From Frans (on forum):
2335
2336I just wonder how the following can be done.
2337
2338Let say I set a timetable for a specific term with constraints. The timetable is accepted by everyone and published.
2339
2340What I do now for the next term is to export the information, I am interested in the activities, as csv files. These files are send to the people in charge to make changes for the second term for example. What I want to do now is to import the activity files using Fet to set the timetable for the specific term.
2341
2342I do have a problem now. If I import the activities then I must add the constraints from scratch, hundreds of them.
2343
2344If there are only one or two constraints and a few changes to the activities that is ot a problem.
2345Is there not a way that the existing constraints can be inported withou entering them again.  I know that I can save the timetable with data, including constraints, but this is of no help to me.
2346
2347Is there a solution?
2348
2349147---------------------------------------------------------
2350From y (on forum):
2351
2352y: Teacher S has to leave early either on Thursday or Friday. This means that in one out of these two days he has to finish at the 4th hour the latest. How can I do that?
2353
2354Liviu: Say slots are Thu 5,6,7 and Fri 5,6,7. Add occupy max 1 slot from selection for each pair, starting with selection Thu 5 + Fri 5, then Thu 5 + Fri 6, ..., Thu 7 + Fri 7 (3x3=9 constraints). Should work, right? Because you cannot have valid any pair of hours from different days.
2355
2356y: Yes, I think it should work. I'll try this!
2357
2358Thanks a lot!
2359
2360Maybe, in a future version of FET, you could add an extension of the constraint "a teacher works in a hour interval max days per week", to allow to pick which days we want to apply this constraint, and not necessarily the whole week. It could be renamed to "a teacher works in a hour interval, max days from a days set" or something similar. Do you think something like this is feasible?
2361
2362148---------------------------------------------------------
2363From Christian Kemmer (on forum):
2364
2365For the next timetable at our school, I need the following:
2366
2367Hours 5 and 6 at one day have the same activity.
2368
2369So I could decide by myself to add an activity 2+1+1 and give the subactivity with "2" hours a special activity-tag "2h" or something like that. I can do this for many activities and then only allow activities with tag "2h" to be placed in hour 5.
2370But if I do this, I have to decide, which acitivity should be placed there. If I choose too much activities, there will also be activities lasting two hours during other times of the day, which is not wanted in many cases.
2371
2372I could also use constraint "consecutive if same day", but then an activity 1+1+1+1 may become 2+2. But I only want 2+1+1 or 1+1+1+1 for that kind of activities. I am also not sure, how to ensure that "consecutive if same day" is only used for hours 5 and 6.
2373
2374So, what would be the best solution to let FET decide which activities to use, so that for every student and every teacher for every day I have the following:
2375If the student / the teachers has an activity in hour 5, he also has this activity in hour 6. Each activity may only have one two hour lesson (like 2, 2+1, 2+1+1, 2+1+1+1), but no activity is allowed to have more than one two hour lesson (like 2+2, 2+2+1).
2376
2377I hope that I have explained it clearly.
2378
2379Thanks for your help.
2380
2381...
2382
2383The reason is the following: Between 1st and 2nd hour there is a small break for students and teachers to change rooms. Between 3rd and 4th hour, there is also this small break. Between 5th and 6th hour, there is no break. So the teacher and the students must stay in the room without any break.
2384
2385So I want to avoid those two hour lessons for all 1+1+1+1 and 1+1+1 and 1+1 activities if possible, but during 5th and 6th hour, I need them.
2386
2387Liviu Lalescu: I think the best is a new constraint, students/teachers max building changes in a time interval, and each room is in a different building in your case.
2388
2389149---------------------------------------------------------
2390(see also items #58, #368, and #396)
2391From uni_instructor (on forum):
2392
2393Finding a good optimized timetable means playing around with the parameters and constraints.
2394
2395In my opinion an UNDO (button) would be a helpful feature, since I could add / or modify some constraints and test the feasibility of the new timetable. Otherwise I can undo my last modifications and retry the timetable generation with other settings.
2396I conceive an UNDO function as it can be seen e.g. in MS-office showing a history of my last n modifications, where n ist the number of undoable steps.
2397The "history" of modification-steps would give me a good hint on what steps I could try otherwise.
2398
2399150---------------------------------------------------------
2400From Nemo (on forum):
2401
2402Issue is I am always having to make changes as teachers leave, swap etc. I of course have the timetable 'fixed' but it is quite laborious to make changes to rooms etc.
2403
2404What it really needs now is a front end any one can use for room changes/teacher changes for a fixed timetable. I have plenty of programming experience (from a  long time ago though) so using FET no issue for me. But even the ICT teachers can't understand it easily.
2405
2406The other major issues we face is cover - would be fantastic to have a cover generator. That takes up a lot of time practically as teachers are off sick and the time taken to check their timetable and find others free is a job that would be nice at a click of a button. I know these are "nice to haves" but I bet a lot of FET users have the same practical issues day to day.
2407
2408151---------------------------------------------------------
2409From Anton Anthofer (see also item #275):
2410
2411- modify the IDs of (sub)activities.
2412- possibility to remove subactivities.
2413- multicore generation for multiple timetables generation.
2414
2415Also suggested by sln_rj, on forum:
2416
2417Is it possible to edit a split option in activity once we entered the data in FET?
2418
2419152---------------------------------------------------------
2420From yasin dehghan:
2421
2422can you add excel export to software
2423this is so useful for view and share
2424
2425153---------------------------------------------------------
2426From Leandro Bueno:
2427
2428I have another question to you. If you open the file, you may have seen that the schedule of our school has 3 turns (morning, afternoon and evening),
2429but, the activity hours are of one clock hour for the evening and 50 minutes (clock) for the morning and afternoon turns. I can generate the timetable,
2430but the statistics only considers FET hours, but the FET hour to clock hour relationship is not defined. This relationship would help generate the work
2431hours of the teachers (in clock hours). Today, I take the statistics and make a spreadsheet applying the relationship between FET hours and clock hours.
2432
2433I think that something like a relationship between FET and clock hours should be interesting to add in future versions, so the teachers statistics could
2434be shown in terms of number of activities (as it is today) and clock hours in a quick way, right from the FET interface.
2435
2436154---------------------------------------------------------
2437From Leandro Bueno:
2438
2439Always (or never) use span in the HTML timetables if an activity has
2440duration larger than 1.
2441
2442155---------------------------------------------------------
2443From Leandro Bueno:
2444
2445Another suggestion for a future release is the option to only
2446"print" to HTML the hours that the students have. In my case, I have
2447students divided in turns (morning, afternoon and evening) and each
2448turn only have activities in that specific turn. When I generate the
2449tables, the morning students' table have the afternoon and evening
2450hours as not available (there are restrictions for this in the .fet
2451file). The same occurs in the afternoon and evening students. I
2452suggest that these not available hours of the students don't end up
2453in the final HTML table.
2454
2455Amendment by Volker Dirr:
2456
2457Should be generalised from "hours" to "hours or days or both".
2458
2459156---------------------------------------------------------
2460From Yush Yuen:
2461
2462It would be cool if there could be an interactive way to do the timetable
2463generation. For example, in the middle of the generation, I can remove
2464some constraints on the fly, un-allocate allocated activities, move
2465activities in different order, ... etc. The work flow might be something
2466like this:
2467
2468- hit the pause button
2469- select activities to be free
2470- inactivate any constraints
2471- move some activities to the front
2472- hit the re-start button
2473
2474I suppose it will only benefit some crazy hard timetable like my school.
2475Even that, the timetable is probably plain impossible, but such interactive
2476approach would make it easier to remove key constraints that makes things
2477difficult.
2478
2479157---------------------------------------------------------
2480From Yush Yuen:
2481
2482Is it possible that FET could be
2483customized to do the following:
2484
2485- Have most of the activities with preferred time and space initially
2486- but once being placed, it will be treated as if the time and space
2487allocated was not "preferred" so will be free to float
2488
2489I am hoping that this way, I can obtain better solution by using a
2490completed version, unlock some year, then let the program to run again.
2491
2492Liviu: I did such a custom version for Yush, but it turns out not to work
2493as needed, because of broken soft constraints.
2494
2495158---------------------------------------------------------
2496From Yush Yuen:
2497
2498(Also suggested by daviodan: multiple selection with Ctrl or Shift in the
2499all time/space constraints and activate/deactivate them with a single click).
2500
2501It would be great if the list of "all time constraints" could be a
2502multiple select box. Currently, the way I unlock allocated time is by going
2503to the "all time constraints" list, filter out the years that I want to
2504open, then remove them one at a time. Actually, before that, I go to the
2505student view of the generated timetable, select all, then click unlock time.
2506
2507It would be nice if I can just do multiple selection and click the "remove"
2508or deactivate button just once.
2509
2510159---------------------------------------------------------
2511From Volker Dirr:
2512
2513FET -> Data -> Time Constraints -> Activities -> A set of subactivities
2514have a set of preferred starting times / time slots.
2515Need also the value to select all activities with the same duration.
2516(because activities with duration 2 should start only in 1., 3. and 5. hour).
2517With this constraint a user would need only to set a single constraint instead
2518of adding a lot of constraints or activity tags.
2519
2520160---------------------------------------------------------
2521From Volker Dirr:
2522
2523get rid of some "unneeded" tags in the xml file.
2524"unneeded" means: they contain redundant data. this data can be used to
2525assert the dataset, but is unneeded.
2526for example:
2527<Number> in hours list, days list, ...
2528
2529161---------------------------------------------------------
2530From Volker Dirr:
2531
2532if fet can't generate the data ("Cannot generate - please modify your
2533data"), then the "view difficult activities" pushbutton is disabled. So a
2534user can't search the bug. so a) enable the pushbutton or (maybe even
2535better (but only if you use only 100% constraints?)), display the
2536difficult activities in that textedit with the "Cannot generate - please
2537modify your data" string.
2538
2539162---------------------------------------------------------
2540From Volker Dirr:
2541
2542generation_pre request: warn if activities has 100% same starting time and
2543100% preferred room in the same room.
2544
2545163---------------------------------------------------------
2546From Volker Dirr:
2547
2548do an other check in generation_pre.cpp:
2549if an activity has only 100% one room possible (by one or more
2550constraints), then sum all hours of the same room and check if (number of
2551available time slots for room) >= (number of 100% needed slots for this
2552room by activities).
2553
2554164---------------------------------------------------------
2555From Volker Dirr:
2556
2557name of constraints isn't always the same:
2558fet has for example: "teacher not available times" constraint.
2559but it also has :"A set of activities has preferred times"
2560But are these times preferred? The opposite times are not available.
2561So this constraint should be called "A set of activities has not
2562allowed/available times".
2563
2564maybe even the "activity prefferd time" is also bad, because it is not
2565only preffered. that is a 100% constraint. even the fet interface call it
2566"locked". So this constraint should be "An activity has a locked time".
2567
2568so we get rid of all "preferred" stuff by that. (using instead only
2569"locked" or "not available").
2570
2571165---------------------------------------------------------
2572From Volker Dirr:
2573
2574if a constraint doesn't refer to an activity, then generating shouldn't
2575refuse generating. that constraint should be just skipped. Like inactive
2576things are skipped. it can warn, but not refuse generating.
2577
2578(this is highly useful, because someone hunt bugs in his dataset, he can
2579just delete for example some years; just to check if this smaller stuff is
2580solveable, but some constraints might now refer to no activity anymore,
2581because the activities are deleted.)
2582
2583166---------------------------------------------------------
2584From Yush Yuen:
2585
2586I made a custom version for myself with a "remove all" button
2587in the "all constraints" dialog box. I found it necessary for me when I
2588want to unlock the time constraint for a whole year after a timetable is
2589generated. The "remove all" button in combination with the filter function
2590make it very easy to remove a large set of constraints. I was trying to
2591change the selection box to a multi-select and have a "remove all selected"
2592button, but I couldn't figure out how to do that easily (hard to manage the
2593index of array after each removal), so I did the simple remove all instead.
2594It worked great for me. So, maybe you can consider something similar for
2595your official release.
2596
2597167---------------------------------------------------------
2598From karim (forum personal message to Liviu Lalescu):
2599
2600max gaps (hours) between a set of activities
2601
2602Within :
2603time constraints -->activities
2604 -min gaps (hours) between a set of activities
2605+max gaps (hours) between a set of activities
2606
2607168---------------------------------------------------------
2608From Davide Cottignoli (on forum):
2609
2610I would suggest a new simple constraint for teacher:
2611In Italy, the work contract for a teacher is often tethered to a specific number of workdays so, to achieve the desired result, is necessary to insert two constraint:
2612"Max days per week for a teacher" and "Min days per week for a teacher" that have to set the same value.
2613Why not add a "Number of workdays per week for a teacher"?
2614In the interface I am glad to see a button that add all teacher and set every single-type constraint to the same value so to be individually modified later.
2615
2616169-------------------------DONE----------------------------
2617
2618170---------------------------------------------------------
2619From agemagician (on forum):
2620
26211- Print the name of the year, group and class under the institute name.
26222- Print the schedule from right to left rather than left to right "very useful for Arabic countries like our academy". - Qt bug (Liviu)
26233- Make a bold line between each day in the printing and light line between periods.
26244- Make a bold line between groups in the printing.
26255- Change the font in the printing.
26266- Export the schedule to excel.
2627
2628171---------------------------------------------------------
2629From Vlăduț Frățiman (personal email to Liviu Lalescu):
2630
2631He suggests to drop activities ids and use instead the teacher, students and subject, because ids might puzzle the new user.
2632
2633Also, he suggests to add icons to the buttons.
2634
2635172---------------------------------------------------------
2636From vlad2005 (on forum):
2637
2638For gaps constraints (and others, maybe) specify the interval for which the constraint should action. Useful for instance
2639if the user wants teachers to have zero gaps in the morning and in the afternoon, but can have gaps in between these two
2640periods.
2641
2642173---------------------------------------------------------
2643From Davide Cottignoli (on forum):
2644
2645I don't know if comments constraint is a widely spread practice but when I add or modify a constraint I often use these, so add a "comments" button in these dialogs it would be greatly appreciated. Also ad enable/disable constraint button would be useful.
2646I often use comments to group same constraints but alphabetic sort and group by constraint-type, comments and insert order I think would be useful; could you add a preference dialog for these and others future settings?
2647
2648174---------------------------------------------------------
2649From liquid (on forum):
2650
2651I'd suggest to move print command from Timetable menu to File menu. IMHO, It's more common to have print command there than anywhere else. It may be worth to implement inside Print command some kind of radio button to choose what to print. Overall, it's good to have Print command anyway.
2652
2653175---------------------------------------------------------
2654From mouiata (on forum) (regarding the custom Algeria version)
2655
2656I suggest that the constraint is added under distinguishes between unloading the morning or evening, especially for a professor in the Algerian version of the program
2657The program is currently the constraint
2658a teacher works in an hourly interval max days per week
2659This is what allows unloading of several periods of morning and evening for the professor without distinguishing between the morning and evening.
2660In Algeria, a lot of professors in favor of unloading the evening than the morning
2661I propose to add the the constraint
2662The least possible number of evening periods that can be discharged to Professor
2663The least possible number of mornings that can be discharged to Professor
2664
2665Liviu: Do you mean maximum number, not "least"?
2666
2667mouiata: I mean, the minimum number if possible
2668If it is not possible The maximum number
2669
2670176---------------------------------------------------------
2671From clouds (on forum):
2672
2673Topic: teachers for hour
2674
2675What do you think about a function that shows for each hour of the day how many teachers can be assigned at every hour (under the constraints set).
2676In this way it's possible to see what are the most problematic hours
2677
2678177---------------------------------------------------------
2679From MarioMic (on forum):
2680
2681When I create multiple timetables with fet, to eliminate the bad results (with a high number of conflicts), I have to manually select and
2682remove the folders of the bad timetables in the output path. This is especially annoying if I have many timetables since the names of the
2683folders do not show the level of conflict (it also would be useful to have this, too), and moreover occupy disk space unnecessarily.
2684
2685It would be useful (for the gui and the command line version) to have an option to save only timetables below a configurable threshold of
2686maximum level of conflict.
2687
2688Liviu Lalescu: since version 5.20.2 we added a detailed report for multiple generation of timetables.
2689
2690178---------------------------------------------------------
2691From Silver (on forum):
2692
2693I suggest you add new window (interface or small editor) for css .
2694for hide and view rooms and subject in "teachers_time_horizontal.html" and other timetables.
2695
2696179---------------------------------------------------------
2697From nouvakis (on forum):
2698
2699Min hours per day, max hours per day:
2700
2701I use these constraints but there is a problem.
2702If I set
2703min_hours = 3 and
2704max hours = 5
2705and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3
2706but a better one should be: 5 + 5 + 4 + 4 + 3
2707
2708So, I recommend a new constraint like "frequency of max hours per day"
2709For my example this new parameter would be 2 (5+5)
2710
2711180---------------------------------------------------------
2712From Pietro (on forum), also by Matsumoto (on forum):
2713
2714--> A part suggested by Pietro is DONE <--
2715
2716The second part, suggested by Pietro (on forum):
2717
2718It would be very nice if the border between different days was thicker.
2719
2720Or, as suggested by Matsumoto (on forum): A common point my colleagues present is that there's very little emphasis between different days
2721(like on Teacher's Time table), and it'd be good to have a way to maybe add a thicker line between the different days to separate them better, is it achievable?
2722
2723Or, as suggested by liquid (on forum): I suggest (please) to divide days with bolder or thicker lines. For me, it would enhance clarity when viewing or
2724printing a schedule, both in printable and viewable versions.
2725
2726181------DONE since FET-5.21.0 - 3 December 2013------------
2727
2728182---------------------------------------------------------
2729From Bobby Wise (on forum):
2730
2731I think it would be a good idea if the printing of All Activities could be in consecutive order from the lowest grade to the highest, or in alphabetical order. Similar to the Activity Planning.
2732
2733I think that the print order now is in Activity sequence.
2734
2735183---------------------------------------------------------
2736From nouvakis (on forum):
2737
2738The Min days between activities constraint has a weight percentage which I set to 95%.
2739
2740I think that there should be another weight percentage for the option "if activities in same day, force activities consecutive" (when checked) because you handle it as a 100%.
2741
2742If this is possible, then the word force should be replaced by something else.
2743
2744184---------------------------------------------------------
2745From Tonny Chan:
2746
2747Please add a multiple select and then add to FET, then I need not to click the students one by one to a course.
2748
2749185------------------------DONE-----------------------------
2750
2751186---------------------------------------------------------
2752From plaldw (on forum):
2753
2754Max building changes in a time interval.
2755
2756187---------------------------------------------------------
2757From llbuenoo (on forum):
2758
2759I would like to generate a report that show the teachers and theirs restrictions (mainly the "Teachers not available times") and Activities related to the years (with its Groups and subgroups), in a way that I can better manage the distribution of the teachers activities according to their availability.
2760
2761I have been making this by hand, but it generates a lot of work on each manual iteration on the timetable. As the data is stored on the FET database, it could be generated directly by the program.
2762
2763I think in a pair of tables per year, one with the teachers and their activities in that year and another with the "teachers not available time" for that year.
2764
2765With this table it could be simpler to redistribute Activities or teachers.
2766
2767188---------------------------------------------------------
2768From Frans (on forum):
2769
2770In the data and timetable fet file the sizes for subjects are indicated. Is it not possible when export to csv file to also export the group and/or subject sizes.
2771
2772In some institutions the group and subject size are important in calculating workloads and ftes for lecturers.
2773
2774The groups with the respective sizes are already exported but this is not always the same for all subjects as the number of students can be changed on the add activities page and this is not exported.
2775
2776189--------------------------DONE---------------------------
2777
2778190---------------------------------------------------------
2779From Volker Dirr:
2780
2781most users use the split year automaticly feature only.
2782some need more categories, but that will produce to many subgroups.
2783
2784so how about this feature:
2785a user can disable the "year-group-subgroup" fet and enable only a
2786"year-group" one.
2787so he can't modify, add, delete, ... subgroups anymore. subgroups will be
2788only used and gererated automaticly in the pregeneration and generation
2789part.
2790
2791split year automaticly will look the same, but it won't produce subgroups.
2792instead of this it still store an integer number with the catagory number
2793to each group.
2794
2795now only one new basic time constraint is needed:
2796(i will explain in 2 steps, but i think it can be imporved by storing that
2797value.)
2798
2799if you place an activity into a timeslot, then:
28001. step: it need to check if there is already an activity of the same year
2801stored.
2802no: -> place activity
2803yes: -> 2. step
2804
28052. step: check if that activities (same year) (in fact it need to check
2806only the first one, because others are already the same) have the same
2807category.
2808no: -> impossible to place activity
2809yes: -> place activity
2810
2811
2812i am not 100% sure, but i think with this kind of timetabling we can save
2813space and maybe also improve speed.
2814
2815the problem is:
2816how to implement both features ("year-group-subgroup" fet and enable only
2817a "year-group" one.) at the same time without confusing a user?
2818
2819191---------------------------------------------------------
2820From Boubker (on forum):
2821
2822Je tente de générer un emploi  du temps pour mon collège  et je  bute sur un petit problème est le suivant :
2823Pour un enseignant  donné  « T »  j’ai affecté des classes répartis sur 3 niveaux (N1, N2 et N3) et je désire que cet enseignant  se voie attribuer  des classes de deux niveaux max par jour :
2824C’est-à-dire que  cet enseignant  aura dans un jour de travail des classes des niveaux (N1 et N2) ou bien (N1 et N3)  ou bien (N2 et  N3).
2825Es ce que vous pouvez me dire comment faire ?
2826
2827192---------------------------------------------------------
2828From mbarsan (on forum):
2829
2830We have a school with 8 periods per day, with a short break every 2 hours.
2831There are 3 buildings.
2832Teacher may change building during those short breaks.
2833So we  haven't to say to FET any duration to change buildings. This may be done at beginning of hours nn. 3, 5 and 7.
2834If a teacher works in a building at first and second periods, he may change building and work at third period.
2835
2836We may chose to insert breaks times (students and teachers not available) between periods 2 and 3, 4 and 5, 6 and 7 to allow building change in a period. But now we can handle 3 hours lessons only with the constraint "two activities are grouped", using the same teacher and same class with (sub)activities of 1 and 2 hours. We have also problems with subactivities with duration 2 that FET may not put with a break inside (so we have to use the same trick as above).
2837
2838Do you think that we may define a grid of hours to allow building changes only at specific periods?
2839
2840193---------------------------------------------------------
2841From _indianajones (on forum):
2842
2843I think it would be useful, in case of difficult generation, to save the incomplete timetable in a .fet file without stopping the process,
2844so I could convert this file with "Excel FET file import 2010 Marco Albano ver 2.0" and try to solve it manually.
2845
2846---
2847
2848Liviu Lalescu: Generate, stop, advanced lock -> lock all activities of current timetable -> save file.
2849
2850---
2851
2852_indianajones: ...but in this way the generation is definitively stopped.... am I wrong?
2853
2854After hours of elaboration I wish to save the best timetable found and let FET goes ahead...
2855is it possible?
2856
2857---
2858
2859Liviu Lalescu: Oh, sorry, I did not see that you wanted generation to continue.
2860
2861I'll add your suggestion in the TODO, but it is not very nice, because I prefer FET to save .fet timetable files only when they are complete.
2862
2863Meanwhile, you can do this, for only one interruption (if you have a multiple core computer): start two generations on the same timetable, with the same FET version, with the same initial random seed state, then interrupt one of them after a few hours, and leave the other one running.
2864
2865194---------------------------------------------------------
2866(see also entry #26)
2867From russell (on forum):
2868
2869I hope FET could plan courses soon.
2870
2871195---------------------------------------------------------
2872From russell (on forum):
2873
2874I have a teacher come to school in Monday and Wednesday OR in Tuesday and Friday. How to implement this constraint in FET? (I have some other constraint related to that teacher and his activities)
2875
2876---
2877
2878Liviu Lalescu:
2879
2880It would be easy to make a change in the code for this. But I don't know how to make it a general constraint with FET-style-name.
2881
2882These tricks might work:
2883
2884- Teacher not available on Thursday;
2885
2886- Max days per week for this teacher = 4;
2887
2888- Add two dummy activities for this teacher, duration = number of hours per day. Not allowed on Thursday (not really needed, because the teacher is not available). Then min+max 3 days between them;
2889
2890I hope I got all the details. Please correct me if I am wrong.
2891
2892---
2893
2894russell:
2895
2896Thanks for your reply.
2897
2898Can you please explain to me about "min+max 3"?  Dose it mean exactly 3 days distance (Tuesday to Friday)?
2899
2900Dose your solution work for days with different hours (Monday has 8 hours and others 6)?
2901
2902---
2903
2904Liviu Lalescu:
2905
2906The constraint min, then max days between activities.
2907
2908If the teacher cannot have more than 6 working hours on Monday, use a constraint activities occupy max time slots from selection for his activities, so he has no more than 6 working hours on Monday (less work for you).
2909
2910If he can have 7 or 8 real working hours on Monday, a lot of work for you: constrain each pair dummy - real activity pair for this teacher to not be on the same day (min 1 days between activities).
2911
2912Please think of other solutions, if you want.
2913
2914---
2915
2916russell:
2917
2918Most of the “select a day’s group from a set of the day’s group for a teacher” constraints can implement by other FET constraints. But if FET has a specific constraint for that it would be better.
2919
2920---
2921
2922Liviu Lalescu:
2923
2924Maybe better "Teacher works in a days group from a set of days groups".
2925
2926196---------------------------------------------------------
2927From russell:
2928
2929Maybe adding a Pause/Resume to "Generate new timetable" window (changing Start button after press to Pause).
2930
2931(Related to item #277.)
2932
2933197---------------------------------------------------------
2934From nouvakis (on forum, also from mercurialuser, also on forum):
2935
2936If I set
2937min_hours = 3 and
2938max hours = 5
2939and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3
2940but a better one should be: 5 + 5 + 4 + 4 + 3
2941
2942So, I recommend a new constraint like "frequency of max hours per day"
2943For my example this new parameter would be 2 (5+5)
2944
2945---
2946
2947Liviu:
2948
2949I am thinking of making it a separate constraint. And put it before max hours daily in the menu, because it might be better than the old existing constraint. Only 100% weight percentage allowed. How to name it? "Teacher(s)/Students (set) max hours daily max occurences per week"?
2950
2951---
2952
2953Liviu:
2954
2955I thought about this. I looked over the present code (official FET-5.23.3, src/engine/generate.cpp).
2956
29571) The changes are very difficult in generate.cpp. There are many possibilities to consider, and maybe a perfect treatment is impossible.
2958
2959See for instance generate.cpp, lines 7543-7572. These are for a unique limit per day. But if you want two possible limits (5 two times per week, the rest maximum 4), the things become much more difficult.
2960
2961(I care in these lines above about the gaps.)
2962
29632) The changes are critical in generate.cpp. New timetables might become impossible.
2964
2965Anyway, I'll keep this suggestion in my mind. But for now I do not have the courage/possibility to do it.
2966
2967I hope that by using some tricks you can overcome the problems.
2968
2969See also fet-v.v.v/doc/algorithm/improve-todo-item-197.txt.
2970
2971---
2972
2973From mercurialuser:
2974
2975Italian school, students have 5 days, 6 periods each.
2976Teachers teach 18 periods.
2977
2978I have a min hours per day set to 2, and some teachers have 2 days with 2 hours and unfortunately 2 days with 5 teaching hours...
2979
2980Is it possible to tell FET that teachers may teach 2 periods and 5 periods only once in a week ?
2981
2982I'm testing with minimum hours per day set to 3 but I feel it is a too strict requirements...
2983
2984198---------------------------------------------------------
2985From Volker Dirr (also from mouiata, on the forum):
2986
2987new useful constraint:
2988time constraints -> teachers -> max total sum of teachers gaps per week
2989
2990199---------------------------------------------------------
2991From liquid (on forum):
2992
2993I think it would be useful to introduce aliases for years, groups and subgroups. Their names sound kind of technical, particularly when one lets FET automatic year divide. It's OK when you work with schedule but it would be more readable when aliases were shown (of course if present) on the timetable.
2994
2995Volker:
2996
2997Maybe i missunderstood, but it sound to me like you are talking about the names that are generated automatically. You can simply rename them (by "modify") if you want (no problems with years and groups. be carefull with subgroups, because you must do it several times!)
2998
2999liquid:
3000
3001I exactly thought about what Volker had understood. E.g. if you had groups and subgroups automatically generated the name for resulting subgroup would come from names of groups and a year. It would be desirably sometimes to give the generated subgroup a more descriptive name. As the example:
3002year - 1
3003group division: 1. by a and b 2. by i1 and i2 (i for computer science)
3004you will get the following groups: 1 a, 1 b, 1 i1, 1 i2
3005and subgroups: 1 a i1, 1 a i2, 1 b i1, 1 b i2
3006For generation purposes it's OK thanks short names but if you wanted to make a timetable for all the students and teachers they would like maybe 1a comp.sci. group 1. That's what I think about.
3007
3008Liviu:
3009
3010But why not simply divide by a,b then comp.sci. group 1,comp.sci group 2?
3011
3012liquid:
3013
3014...just for simplicity's sake. Aliases almost always serve as more descriptive names. If I tried to give more descriptive names for groups they might not fit into boxes at activity setting window or elsewhere. Particularly when group division is not trivial. Short names are good while designing a schedule.
3015
3016Volker:
3017
3018I can recommend using short names. I use everywhere shortcuts (subjects has only 1-2 characters. Teacher names 3 characters. Students only around 1 to 4 characters.)
3019Of course new students "wonder" the first day about that shortcuts, but they are clever enough to understand it very fast.
3020
3021liquid:
3022
3023Oh, maybe that's the right way. I was afraid that schedule could be misunderstood with many short and cryptic names but your experience tells the opposite. OK then, thanks for suggestions.
3024
3025---
3026
3027liquid suggests also aliases for rooms.
3028
3029Also from abautu, on forum: Could you add an extra field for subjects and teachers to allow for a short name/abbreviation of it?
3030For example, for a subject called "Classical literature" a short name could be "CL" or "C-101". Then the print timetable features
3031would allow to print the short names (i.e. compact timetable) or long names (i.e. normal timetable).
3032
3033See also item #324
3034
3035200---------------------------------------------------------
3036(Added on 2014-10-12)
3037From fromturkey (on forum):
3038
3039I think the program should be able to use multiple CPUs/cores. Especially when trying to generate difficult timetables it takes a lot of time processing. If the program could use multiple CPUs, it would take much more shorter.
3040Is it possible with the current algorithm?
3041
3042Liviu:
3043
3044Unfortunately, I cannot think of how to adapt the FET algorithm to multiple cores.
3045
3046201-------------------------DONE----------------------------
3047
3048202---------------------------------------------------------
3049From Vanyo Georgiev (on forum):
3050
3051The last opened FET XML file is opened again at start up.
3052
3053(Vanyo Georgiev provided the necessary code changes to do this.)
3054
3055203---------------------------------------------------------
3056From Vanyo Georgiev (on forum):
3057
3058One more place to check for a language .qm file - the work path.
3059
3060(Vanyo Georgiev provided the necessary code changes to do this:
3061	translation_loaded=translator.load("fet_"+FET_LANGUAGE, QDir::currentPath());
3062in fet.cpp.)
3063
3064This change makes possible by setting the Working directory of the exe file in QtCreator to test the current translation without copying the .qm file to another directory.
3065
3066204---------------------------------------------------------
3067From Vanyo Georgiev (on forum):
3068
3069Save and restore tabWidget current page at start up.
3070
3071(Vanyo Georgiev provided the necessary code changes to do this.)
3072
3073Liviu: See the ChangeLog for FET-5.19.0: "- When starting FET, the first shortcuts tab section (File) is selected (suggested by a user)." Previously, I saved the main tab widget position (as you do), but a user suggested that it is better to start always with the File tab selected.
3074
3075Anyway, I'll add this in the TODO, as your suggestion.
3076
3077Vanyo Georgiev: May be there must be a setting: 'Remember current page' and each user to choose his own preference. I'll try to do so.
3078
3079(Vanyo Georgiev provided the necessary code changes to do this.)
3080
3081205---------------------------------------------------------
3082From bharatstank (on forum): ( https://lalescu.ro/liviu/fet/forum/index.php?topic=1826.0 )
3083
3084bharatstank:
3085
3086I have below created a Student structure (having 60 students):-
3087
3088(Student) Year - Group - Sub Group
3089
3090Year                    Group                    Sub Group
3091MBACPM (60)       MBA CPM L (60)     MBACPM G1 (30)
3092                                                       MBACPM G2 (30)
3093Activity Tags:
3094Lecture
3095Tutorial
3096Practical
3097
3098Activities created are as follows:-
30991. MBA CPM L (Lecture) of a SUBJECT1 for 2 hours duration is conducted by a FACULTY1 for all the 60 students
31002. MBA CPM G1 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
31013. MBA CPM G2 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
31024. MBA CPM G1 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
31035. MBA CPM G2 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
3104
31056. MBA CPM L (Lecture) of a SUBJECT2 for 2 hours duration is conducted by a FACULTY2 for all the 60 students
31067. MBA CPM G1 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
31078. MBA CPM G2 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
31089. MBA CPM G1 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
310910. MBA CPM G2 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
3110
3111and so on...
3112
3113How to place the activities - so that:-
31141. For Subject1 - Lecture followed by Tutorial followed by Practical is conducted in sequence in a day and FET do NOT place tutorial or practical before Lecture
3115
3116I want to use this process as a template for every subject (Lecture -> Tutorial -> Practical). So that FET places all the possible activities according to this template.  and constraints are only applied in case of specific activities or exceptions.
3117
3118How to achieve this scenario.
3119
3120---
3121
3122Liviu:
3123
3124I am not sure I understand well, but I think you can use a constraint three activities grouped and two constraints two activities ordered.
3125
3126---
3127
3128bharatstank:
3129
3130using "constraint three activities grouped and two constraints two activities ordered." - here I need to create manual constraints for all the approx. 200 activities.
3131
3132is there a way - where I can create a Standardised constraints using Activity Tag.
3133I have defined 3 activity tag (which needs to follow the below sequence):-
31341. Lecture
31352. Tutorial
31363. Practical
3137
3138As per the guideline - for subject1 - First lecture is conducted, Then its Tutorial is conducted and then its Practical is conducted.
3139
3140In my case FET does not places activity like (Subject1 lecture -> Subject1 Tutorial -> Subject1 Practical) in sequence but most of the time it places the activity like (Subject1 Lecture -> Subject2 Tutorial -> Subject3 Practical or vice versa)
3141
3142how to resolve this issue.
3143I have also attached the timetable screenshot:-
3144
31451. Correctly placed activity shown in Green circle
31462. Wrongly placed activity shown in Red Circle
3147
3148Here it is not important that Subject1 (lecture, Tutorial, Practical) should be consecutive but has to follow activity tag order (for a particular subject). otherwise timetable starts with Tutorial or Practical without Lecture - which is not feasible.
3149
3150---
3151
3152Liviu:
3153
3154I do not understand the picture in your attachment.
3155
3156If it is not important that the three kinds of activities are grouped, you might need to add only two constraints two activities ordered. You might want to add also a constraint activities same starting day.
3157
3158About making this automatic for activity tags - I have added this in the TODO list.
3159
3160206---------------------------------------------------------
3161From Vanyo Georgiev (on forum):
3162
3163There are translations of the FET User manual in several languages https://lalescu.ro/liviu/fet/doc/
3164
3165I think it would be nice, when there is an User manual in the currently set language of the FET interface, by clicking on the Help -> Online -> Help contents the User manual in the  language of the FET interface is opened.
3166
3167207---------------------------------------------------------
3168From Volker Dirr:
3169
3170someone used split year automatically.
3171
3172this year he doesn't need all classes again. class / group "5 d" is not
3173needed.
3174so he deletes group "5 d".
3175but in fact that doesn't improve speed (much), because the number of
3176subgroups stays the same.
3177
3178but if there will be a question after removing a group (or year) like "do
3179you also want to remove all subgroups of this group in all other groups?",
3180then the number of subgroups will be reduced and it will be easier to
3181generate.
3182
3183(Yes, instead of removing a group he could simply use the split year
3184automatically once again, but maybe he forgot, he has got a new computer, he
3185already changed "presettings" because of other years or the simply fear
3186that he will do it incorrect; so he like to use delete group only, because
3187it is easier.)
3188
3189Volker wrote code for this, but it is not perfectly optimized for speed.
3190Below is his code for file fet-v.v.v/src/interface/groupsform.cpp (see
3191the string Volker Dirr start/end):
3192
3193old file groupsform.cpp - last modified on 8 February 2015 (FET-5.28.0)
3194new Volker Dirr's code: 5 October 2015
3195
3196---
3197//
3198//
3199// Description: This file is part of FET
3200//
3201//
3202// Author: Lalescu Liviu <Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)>
3203// Copyright (C) 2003 Liviu Lalescu <https://lalescu.ro/liviu/>
3204//
3205/***************************************************************************
3206 *                                                                         *
3207 *   This program is free software: you can redistribute it and/or modify  *
3208 *   it under the terms of the GNU Affero General Public License as        *
3209 *   published by the Free Software Foundation, either version 3 of the    *
3210 *   License, or (at your option) any later version.                       *
3211 *                                                                         *
3212 ***************************************************************************/
3213
3214#include "addstudentsgroupform.h"
3215#include "modifystudentsgroupform.h"
3216#include "groupsform.h"
3217#include "timetable_defs.h"
3218#include "timetable.h"
3219#include "fet.h"
3220#include "studentsset.h"
3221
3222#include "longtextmessagebox.h"
3223
3224#include <QMessageBox>
3225
3226#include <QListWidget>
3227#include <QScrollBar>
3228#include <QAbstractItemView>
3229
3230#include <QSplitter>
3231#include <QSettings>
3232#include <QObject>
3233#include <QMetaObject>
3234
3235extern const QString COMPANY;
3236extern const QString PROGRAM;
3237
3238struct subgroupItem{
3239	QString yearName;
3240	QString groupName;
3241	QString subgroupName;
3242};
3243
3244GroupsForm::GroupsForm(QWidget* parent): QDialog(parent)
3245{
3246	setupUi(this);
3247
3248	groupTextEdit->setReadOnly(true);
3249
3250	modifyGroupPushButton->setDefault(true);
3251
3252	yearsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
3253	groupsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
3254
3255	connect(yearsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(yearChanged(const QString&)));
3256	connect(addGroupPushButton, SIGNAL(clicked()), this, SLOT(addGroup()));
3257	connect(removeGroupPushButton, SIGNAL(clicked()), this, SLOT(removeGroup()));
3258	connect(purgeGroupPushButton, SIGNAL(clicked()), this, SLOT(purgeGroup()));
3259	connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
3260	connect(groupsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(groupChanged(const QString&)));
3261	connect(modifyGroupPushButton, SIGNAL(clicked()), this, SLOT(modifyGroup()));
3262	connect(sortGroupsPushButton, SIGNAL(clicked()), this, SLOT(sortGroups()));
3263	connect(activateStudentsPushButton, SIGNAL(clicked()), this, SLOT(activateStudents()));
3264	connect(deactivateStudentsPushButton, SIGNAL(clicked()), this, SLOT(deactivateStudents()));
3265	connect(groupsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(modifyGroup()));
3266
3267	centerWidgetOnScreen(this);
3268	restoreFETDialogGeometry(this);
3269	//restore splitter state
3270	QSettings settings(COMPANY, PROGRAM);
3271	if(settings.contains(this->metaObject()->className()+QString("/splitter-state")))
3272		splitter->restoreState(settings.value(this->metaObject()->className()+QString("/splitter-state")).toByteArray());
3273
3274	yearsListWidget->clear();
3275	for(int i=0; i<gt.rules.yearsList.size(); i++){
3276		StudentsYear* year=gt.rules.yearsList[i];
3277		yearsListWidget->addItem(year->name);
3278	}
3279
3280	if(yearsListWidget->count()>0)
3281		yearsListWidget->setCurrentRow(0);
3282	else
3283		groupsListWidget->clear();
3284}
3285
3286
3287GroupsForm::~GroupsForm()
3288{
3289	saveFETDialogGeometry(this);
3290	//save splitter state
3291	QSettings settings(COMPANY, PROGRAM);
3292	settings.setValue(this->metaObject()->className()+QString("/splitter-state"), splitter->saveState());
3293}
3294
3295void GroupsForm::addGroup()
3296{
3297	if(yearsListWidget->currentRow()<0){
3298		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3299		return;
3300	}
3301	QString yearName=yearsListWidget->currentItem()->text();
3302	int yearIndex=gt.rules.searchYear(yearName);
3303	assert(yearIndex>=0);
3304
3305	AddStudentsGroupForm form(this, yearName);
3306	setParentAndOtherThings(&form, this);
3307	form.exec();
3308
3309	yearChanged(yearsListWidget->currentItem()->text());
3310
3311	int i=groupsListWidget->count()-1;
3312	if(i>=0)
3313		groupsListWidget->setCurrentRow(i);
3314}
3315
3316void GroupsForm::removeGroup()
3317{
3318	if(yearsListWidget->currentRow()<0){
3319		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3320		return;
3321	}
3322	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
3323	assert(yearIndex>=0);
3324
3325	if(groupsListWidget->currentRow()<0){
3326		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
3327		return;
3328	}
3329
3330	QString groupName=groupsListWidget->currentItem()->text();
3331	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
3332	assert(groupIndex>=0);
3333
3334	QList<QString> yearsContainingGroup_List;
3335	QSet<QString> subgroupsList;
3336	//QSet<QString> yearsContainingGroup_Set;
3337	foreach(StudentsYear* year, gt.rules.yearsList)
3338		foreach(StudentsGroup* group, year->groupsList)
3339			if(group->name==groupName){
3340				yearsContainingGroup_List.append(year->name);
3341				foreach(StudentsSubgroup* subgroup, group->subgroupsList)
3342					subgroupsList<<subgroup->name;
3343			}
3344
3345	assert(yearsContainingGroup_List.count()>=1);
3346	QString s;
3347	if(yearsContainingGroup_List.count()==1)
3348		s=tr("This group exists only in year %1. This means that"
3349		 " all the related activities and constraints will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text());
3350	else{
3351		s=tr("This group exists in more places, listed below. It will only be removed from the current year,"
3352		 " and the related activities and constraints will not be removed. Do you want to continue?");
3353		s+="\n";
3354		foreach(QString str, yearsContainingGroup_List)
3355			s+=QString("\n")+str;
3356	}
3357
3358	int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
3359		tr("Yes"), tr("No"), QString(), 0, 1);
3360	if(t==1)
3361		return;
3362
3363	//by Volker Dirr (start)
3364	QList<subgroupItem> removeSubgroups;
3365	QString removeSubgroupsStringForGUI;
3366	foreach(StudentsYear* year, gt.rules.yearsList){
3367		foreach(StudentsGroup* group, year->groupsList){
3368			if(group->name!=groupName){
3369				foreach(StudentsSubgroup* subgroup, group->subgroupsList){
3370					if(subgroupsList.contains(subgroup->name)){
3371						subgroupItem tmpItem;
3372						tmpItem.yearName=year->name;
3373						tmpItem.groupName=group->name;
3374						tmpItem.subgroupName=subgroup->name;
3375						removeSubgroups<<tmpItem;
3376						removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n";
3377					}
3378				}
3379			}
3380		}
3381	}
3382
3383	if(removeSubgroups.count()>0){
3384		s=tr("Subgroups of this group are also used in other groups. They might be needles now. In particular if you used FETs automatic split year feature."
3385		 " Should the following subgroups be removed also?");
3386		s+="\n"+removeSubgroupsStringForGUI;
3387
3388		int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
3389			tr("Yes"), tr("No"), QString(), 0, 1);
3390		if(t==0){
3391			foreach(subgroupItem tmpItem, removeSubgroups){
3392				bool tmp=gt.rules.removeSubgroup(tmpItem.yearName, tmpItem.groupName, tmpItem.subgroupName);
3393				assert(tmp);
3394			}
3395		}
3396	}
3397	//by Volker Dirr (end)
3398
3399	/*if(QMessageBox::warning( this, tr("FET"),
3400		tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName),
3401		tr("Yes"), tr("No"), 0, 0, 1 ) == 1)
3402		return;*/
3403
3404	bool tmp=gt.rules.removeGroup(yearsListWidget->currentItem()->text(), groupName);
3405	assert(tmp);
3406	if(tmp){
3407		int q=groupsListWidget->currentRow();
3408
3409		groupsListWidget->setCurrentRow(-1);
3410		QListWidgetItem* item;
3411		item=groupsListWidget->takeItem(q);
3412		delete item;
3413
3414		if(q>=groupsListWidget->count())
3415			q=groupsListWidget->count()-1;
3416		if(q>=0)
3417			groupsListWidget->setCurrentRow(q);
3418		else
3419			groupTextEdit->setPlainText(QString(""));
3420	}
3421
3422	/*if(gt.rules.searchStudentsSet(groupName)!=nullptr)
3423		QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. "
3424			"The related subgroups, activities and constraints were not removed"));*/
3425}
3426
3427void GroupsForm::purgeGroup()
3428{
3429	if(yearsListWidget->currentRow()<0){
3430		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3431		return;
3432	}
3433	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
3434	assert(yearIndex>=0);
3435
3436	if(groupsListWidget->currentRow()<0){
3437		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
3438		return;
3439	}
3440
3441	QString groupName=groupsListWidget->currentItem()->text();
3442	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
3443	assert(groupIndex>=0);
3444
3445	QList<QString> yearsContainingGroup_List;
3446	QSet<QString> subgroupsList;
3447	//QSet<QString> yearsContainingGroup_Set;
3448	foreach(StudentsYear* year, gt.rules.yearsList)
3449		foreach(StudentsGroup* group, year->groupsList)
3450			if(group->name==groupName){
3451				yearsContainingGroup_List.append(year->name);
3452				foreach(StudentsSubgroup* subgroup, group->subgroupsList)
3453					subgroupsList<<subgroup->name;
3454			}
3455
3456	assert(yearsContainingGroup_List.count()>=1);
3457	QString s;
3458	if(yearsContainingGroup_List.count()==1)
3459		s=tr("This group exists only in year %1. All the related activities and constraints "
3460		 "will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text());
3461	else{
3462		s=tr("This group exists in more places, listed below. It will be removed from all these places."
3463		 " All the related activities and constraints will be removed. Do you want to continue?");
3464		s+="\n";
3465		foreach(QString str, yearsContainingGroup_List)
3466			s+=QString("\n")+str;
3467	}
3468
3469	int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
3470		tr("Yes"), tr("No"), QString(), 0, 1);
3471	if(t==1)
3472		return;
3473
3474	//by Volker Dirr (start)
3475	QSet<QString> removeSubgroups;
3476	QString removeSubgroupsStringForGUI;
3477	foreach(StudentsYear* year, gt.rules.yearsList){
3478		foreach(StudentsGroup* group, year->groupsList){
3479			if(group->name!=groupName){
3480				foreach(StudentsSubgroup* subgroup, group->subgroupsList){
3481					if(subgroupsList.contains(subgroup->name)){
3482						if(!removeSubgroups.contains(subgroup->name)){
3483							removeSubgroups<<subgroup->name;
3484						}
3485						removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n";
3486					}
3487				}
3488			}
3489		}
3490	}
3491
3492	if(removeSubgroups.count()>0){
3493		s=tr("Subgroups of this group are also used in other groups. They might be needles now. In particular if you used FETs automatic split year feature."
3494		 " Should the following subgroups be removed also?");
3495		s+="\n"+removeSubgroupsStringForGUI;
3496
3497		int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
3498			tr("Yes"), tr("No"), QString(), 0, 1);
3499		if(t==0){
3500			foreach(QString tmpItem, removeSubgroups){
3501				bool tmp=gt.rules.purgeSubgroup(tmpItem);
3502				assert(tmp);
3503			}
3504		}
3505	}
3506	//by Volker Dirr (end)
3507
3508
3509	/*if(QMessageBox::warning( this, tr("FET"),
3510		tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName),
3511		tr("Yes"), tr("No"), 0, 0, 1 ) == 1)
3512		return;*/
3513
3514	bool tmp=gt.rules.purgeGroup(groupName);
3515	assert(tmp);
3516	if(tmp){
3517		int q=groupsListWidget->currentRow();
3518
3519		groupsListWidget->setCurrentRow(-1);
3520		QListWidgetItem* item;
3521		item=groupsListWidget->takeItem(q);
3522		delete item;
3523
3524		if(q>=groupsListWidget->count())
3525			q=groupsListWidget->count()-1;
3526		if(q>=0)
3527			groupsListWidget->setCurrentRow(q);
3528		else
3529			groupTextEdit->setPlainText(QString(""));
3530	}
3531
3532	/*if(gt.rules.searchStudentsSet(groupName)!=nullptr)
3533		QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. "
3534			"The related subgroups, activities and constraints were not removed"));*/
3535}
3536
3537void GroupsForm::yearChanged(const QString &yearName)
3538{
3539	int yearIndex=gt.rules.searchYear(yearName);
3540	if(yearIndex<0){
3541		groupsListWidget->clear();
3542		groupTextEdit->setPlainText(QString(""));
3543		return;
3544	}
3545
3546	groupsListWidget->clear();
3547
3548	StudentsYear* sty=gt.rules.yearsList.at(yearIndex);
3549	for(int i=0; i<sty->groupsList.size(); i++){
3550		StudentsGroup* stg=sty->groupsList[i];
3551		groupsListWidget->addItem(stg->name);
3552	}
3553
3554	if(groupsListWidget->count()>0)
3555		groupsListWidget->setCurrentRow(0);
3556	else
3557		groupTextEdit->setPlainText(QString(""));
3558}
3559
3560void GroupsForm::groupChanged(const QString &groupName)
3561{
3562	StudentsSet* ss=gt.rules.searchStudentsSet(groupName);
3563	if(ss==nullptr){
3564		groupTextEdit->setPlainText(QString(""));
3565		return;
3566	}
3567	StudentsGroup* sg=(StudentsGroup*)ss;
3568	groupTextEdit->setPlainText(sg->getDetailedDescriptionWithConstraints(gt.rules));
3569}
3570
3571void GroupsForm::sortGroups()
3572{
3573	if(yearsListWidget->currentRow()<0){
3574		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3575		return;
3576	}
3577	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
3578	assert(yearIndex>=0);
3579
3580	gt.rules.sortGroupsAlphabetically(yearsListWidget->currentItem()->text());
3581
3582	yearChanged(yearsListWidget->currentItem()->text());
3583}
3584
3585void GroupsForm::modifyGroup()
3586{
3587	if(yearsListWidget->currentRow()<0){
3588		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3589		return;
3590	}
3591
3592	QString yearName=yearsListWidget->currentItem()->text();
3593
3594	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
3595	assert(yearIndex>=0);
3596
3597	int q=groupsListWidget->currentRow();
3598	int valv=groupsListWidget->verticalScrollBar()->value();
3599	int valh=groupsListWidget->horizontalScrollBar()->value();
3600
3601	if(groupsListWidget->currentRow()<0){
3602		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
3603		return;
3604	}
3605
3606	QString groupName=groupsListWidget->currentItem()->text();
3607	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
3608	assert(groupIndex>=0);
3609
3610	StudentsSet* sset=gt.rules.searchStudentsSet(groupName);
3611	assert(sset!=nullptr);
3612	int numberOfStudents=sset->numberOfStudents;
3613
3614	ModifyStudentsGroupForm form(this, yearName, groupName, numberOfStudents);
3615	setParentAndOtherThings(&form, this);
3616	form.exec();
3617
3618	yearChanged(yearsListWidget->currentItem()->text());
3619
3620	groupsListWidget->verticalScrollBar()->setValue(valv);
3621	groupsListWidget->horizontalScrollBar()->setValue(valh);
3622
3623	if(q>=groupsListWidget->count())
3624		q=groupsListWidget->count()-1;
3625	if(q>=0)
3626		groupsListWidget->setCurrentRow(q);
3627	else
3628		groupTextEdit->setPlainText(QString(""));
3629}
3630
3631void GroupsForm::activateStudents()
3632{
3633	if(yearsListWidget->currentRow()<0){
3634		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3635		return;
3636	}
3637	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
3638	assert(yearIndex>=0);
3639
3640	if(groupsListWidget->currentRow()<0){
3641		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
3642		return;
3643	}
3644
3645	QString groupName=groupsListWidget->currentItem()->text();
3646	int count=gt.rules.activateStudents(groupName);
3647	QMessageBox::information(this, tr("FET information"), tr("Activated a number of %1 activities").arg(count));
3648}
3649
3650void GroupsForm::deactivateStudents()
3651{
3652	if(yearsListWidget->currentRow()<0){
3653		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
3654		return;
3655	}
3656	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
3657	assert(yearIndex>=0);
3658
3659	if(groupsListWidget->currentRow()<0){
3660		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
3661		return;
3662	}
3663
3664	QString groupName=groupsListWidget->currentItem()->text();
3665	int count=gt.rules.deactivateStudents(groupName);
3666	QMessageBox::information(this, tr("FET information"), tr("De-activated a number of %1 activities").arg(count));
3667}
3668---
3669
3670208---------------------------------------------------------
3671From Volker Dirr:
3672
3673Code more checks to warn users about conflicting constraints before generating. For example:
3674min days between activities and consecutive/grouped activities constraints.
3675
3676209---------------------------------------------------------
3677From andrealva:
3678
3679He is referring to the facility to sort constraints by comments, which was dropped (being considered useless) in FET-5.25.0 and subsequent versions:
3680
3681One use though, which can be given to sorting the comments, is to arrange together all the constraints related to a teacher(s) or a class(es) ...
3682it would help to quickly identify them without using the filter ....
3683
3684210--------------------------DONE---------------------------
3685
3686211---------------------------------------------------------
3687From Volker Dirr:
3688
3689FET asks if the user is sure he wants to add an activity without students. Maybe the question must also
3690include something like "it is correct if you want to add a teacher meeting."
3691
3692So that the user is not deterred by the warning in situations in which an activity without students is OK.
3693
3694212---------------------------------------------------------
3695From Bob Hairgrove (on forum):
3696
3697Colors can be enabled for highlighting the cells. However, looking at this function in the FET source code, it is clear that these are hard-coded values:
3698
3699Code:
3700
3701void AddConstraintStudentsSetNotAvailableTimesForm::colorItem(QTableWidgetItem* item)
3702{
3703	if(USE_GUI_COLORS){
3704		if(item->text()==NO)
3705			item->setBackground(QBrush(Qt::darkGreen));
3706		else
3707			item->setBackground(QBrush(Qt::darkRed));
3708		item->setForeground(QBrush(Qt::lightGray));
3709	}
3710}
3711
3712I think the colors should be configurable. For example, I would like to use a light green background for available times and white for not available times in the "student set not available" dialog, whereas for the corresponding teacher dialog, perhaps different colors could be used (white = available; dark grey = not available). In case the colors are used, you could hide the "X" by setting the foreground color to the same as the background color since it would be superfluous. That way, you could keep the rest of the functionality the way it is.
3713
3714213-------------------------DONE----------------------------
3715
3716214---------------------------------------------------------
3717From Khalilullah Yosufi:
3718
3719... we expect from software to generate a timetable that we could separate some border or jointed gaps for some teachers
3720but there is no any place to define/plan to the software about separating the jointed gaps during a day. Hopefully
3721someday we would receive an update version of the FET software that has ability to separate joint gaps we want maybe
3722by the name of continuously gaps per day for a teacher. ...
3723
3724---
3725
3726Further clarification:
3727
3728... Hope one day we could plan or tell to the FET software to add Maximum continuously gaps per day for a teacher = 01 ...
3729
3730---
3731
3732Further clarification:
3733
3734I need a gap to be maximum 1 hour continuously.
3735
3736215---------------------------------------------------------
3737From mercurialuser (on forum):
3738
3739To better study the code I'd like to clean generate.cpp:
3740- removing all the commented code
3741- adding comments to illustrate the algo
3742- check to see if I can use some macros for code
3743- in randomswap try to remove all that ok* variables that can be reduced to a couple (since they are not used outside their block)
3744- remove the #if 1/#endif and if(1) { ... }  blocks
3745
3746216---------------------------------------------------------
3747From mercurialuser (on forum):
3748
3749I'd just like to report some thing that may give a little speedup to the code and to avoid duplicates.
3750
3751For example in ::generate several matrixes are reset first and then assigned. The exact same code is used for loading teachersTimetable and newTeachersTimetable but they could be compacted in one loop. There may be probably less cache hits for accessing these 2 matrixes but I think that the multiple loops and retrieving act variable multiple times are more cpu expensive anyway.
3752
3753For assigning these matrixes and some others the code loops (there are 2 variants with different variable names):
3754for(int j=0; j<gt.rules.nInternalActivities/*added_act*/; j++){
3755
3756The code in the loop does some checks that are replicated in several other loops but they check on data that, as far as I understand, can't change between consecutive checks. So it seems to me that they are redundant.
3757
3758217---------------------------------------------------------
3759From Bob Hairgrove:
3760
3761Liviu:
3762
3763> > I wrote in the advice on how to translate to not translate the
3764> > large 5 fields in HelpAboutForm_template (which contain difficult
3765> > and large fields, subject to future changes). If you check now,
3766> > your translation of the About is lost (but it is inevitable).
3767
3768---
3769
3770Bob:
3771
3772> Wouldn't it be better to have the strings in a separate file where
3773> they could be translated, then build the HTML text in a function
3774> which is not routed through the tr() macros? None of the HTML stuff
3775> should be in the .ts file, anyway ... IMHO.
3776>
3777> Should be easy enough since (I assume) there is only one "About..."
3778> form. I wouldn't necessarily translate the list of translators, but
3779> the names of the languages could be translated and the HTML code built
3780> outside of the tr() function as described above.
3781
3782---
3783
3784Liviu:
3785
3786Unfortunately, I see no easy way to do this. Using a separate file for
3787these is not good.
3788
3789Even if I used simple text instead of HTML, for each new entry I add
3790all the previous translated text is lost, if I lupdate with -noobsolete.
3791
3792I will add this correspondence, and your next email which I just
3793received, to the TODO list.
3794
3795I am not sure what to do.
3796
3797----
3798
3799Part 2:
3800
3801Bob:
3802
3803Of course, if you don't want the HTML in this form to be translated,
3804there is a much easier way to get rid of it (see attached
3805screenshot). ;)
3806
3807(Bob is referring to the property "translatable" of the string.)
3808
3809---
3810
3811Liviu:
3812
3813:-) Yes, sure, I thought of this, but some people might really want to
3814translate in a hypothetical situation. All strings in FET should be
3815translatable, I think (I am not sure, though).
3816
3817218---------------------------------------------------------
3818From Volker Dirr:
3819
3820since FET is able to change split year automatically without losing
3821activities, it is useful to load and save the settings.
3822i don't talk about qsettings. it it already stored there and that is fine.
3823but the settings are different a bit. so year 5 and 6 have very similar
3824categories and divisions, but year 7-10 have got a bit different.
3825so it would be fine to save and load them into a file. so a user can save
3826settings for year 5-6 and save settings for year 7-10. i am not sure if
3827into the fet file or into a separate file. it has different advantages and
3828disadvantages. but i think into a new separate file is a bit better.
3829
3830219---------------------------------------------------------
3831From chintu and Volker Dirr (on forum):
3832
3833chintu: I have 80 teachers in school, in an academic year if one teacher
3834leaves the school the work load of the teacher is shared with 5 teachers
3835and say about 15 teacher in overall is effected. but remaining 65 teachers
3836time table is still the same. If i re generate the time table all 80 teachers
3837time table will be effected, i want to retain the time table same for 65
3838teachers and only change for 15 how can i achieve this?
3839
3840Liviu: You can generate the timetable, then view the timetable for teachers,
3841and select all activities for a teacher and click "Toggle lock/unlock".
3842
3843Volker: Maybe we should make the unlocking possible without generating the
3844timetable, as in the "Advanced lock/unlock" menus.
3845
3846Liviu: In this case, do it also for students?
3847
3848220---------------------------------------------------------
3849From Volker Dirr (on forum):
3850
3851When the user clicks "Toggle lock/unlock" with zero selected cells in the
3852"Timetable view" dialogs, maybe it would be better to inform more verbosely
3853the user: "No activities were locked/unlocked, because no activities were
3854selected".
3855
3856221---------------------------------------------------------
3857From Volker Dirr:
3858
3859in years dialog should be an option: increase all years.
3860
3861now pseudo code: (mixing strings and int. so real code is a bit more
3862complicated)
3863
3864foreach(year, yearsList){
3865 if(year = int){
3866    newYearsList<<year
3867 } else {
3868   warning = "unchanged"
3869}
3870
3871sort newYearsList from high to low
3872
3873foreach(year, newYearsList){
3874  newIntYear=year++;
3875  search that year.
3876  foreach(group, year){
3877     foreach(subgroup, group){
3878       if(subgroup.left(year){
3879         subgroup.replace.left(newIntYear)
3880       else
3881         warning = "impossible to rename. maybe modified manually?"
3882      }
3883     if(group.left(year){
3884       group.replace.left(newIntYear)
3885     else
3886       warning = "impossible to rename. maybe modified manually?"
3887    }
3888    if(year.left(year){
3889       year.replace.left(newIntYear)
3890     else
3891       warning = "critical bug!"
3892   }
3893}
3894
3895
3896222---------------------------------------------------------
3897From Mohamed NAJARI:
3898
38991) Can you add a command to move the teachers, students, materials and activities during entry?
39002) Why not put weight as the 100% value by default instead of 95% during the addition of an activity?
3901
3902223---------------------------------------------------------
3903From youssouf (on forum):
3904
3905My suggestion is : activating the partition button when modifying the teacher's task.
3906because :
39071. We enter the teacher's tasks ( choice - subject - Partition - period - etc.)
39082. When we want to edit the task of a teacher , we find that the division button is not enabled and we will be forced to delete that task and we retype spot again.
3909
3910224------------------------DONE-----------------------------
3911
3912225---------------------------------------------------------
3913From jillali elghazoui (on forum):
3914
3915jillali:
3916At the end of the production time table
3917we sometimes want to change instead of an activity
3918But if we follow the normal route of fet its currency fully all activities
3919Is there is a way to change the place of this activity specifically
3920Without major changes in the other activities
3921
3922Liviu:
3923
3924Either:
3925
39261) Open from ~/fet-results/data_and_timetable.fet, then unlock a specific activity and regenerate;
3927
3928or
3929
39302) After generating, select Advanced lock -> lock all activities of the current timetable. Then unlock a specific activity and regenerate.
3931
3932But you may obtain an impossible timetable.
3933
3934jillali:
3935
3936You're right, we can not get what we wanted
3937Is it possible for this to work  a new property under the name:
3938
3939"a teacher's not available times with the current  timetable"
3940
3941as "not available times" are "the free hours withe the current  timetable"
3942And it will save in "a teacher's not available times"
3943And when we want to produce a new table we change a table for one teacher
3944
3945---
3946
3947We also ask you for a similar property in Students set
3948It seems that these characteristics would be more effective
3949You can set the blank time
3950Although it is possible to move Activitys
3951For a teacher or more
3952Or for one Student set or for more
3953
3954226---------------------------------------------------------
3955From AlexL (on forum):
3956
3957My proposal is to use transifex for translations: https://www.transifex.com
3958It works fine with .ts files, has suggestions for translations, .etc.
3959
3960227---------------------------------------------------------
3961From MilesM (on forum):
3962
3963I think it would be helpful to be able to assign time lengths to periods (even if the actual periods are multiples of that as suggested above) in order to be able to generate statistics on time per subject, per grade etc. It would allow another level of validation to make sure everything works.
3964
3965228---------------------------------------------------------
3966From adso (on forum):
3967
3968It would be useful in the best timetable processed (highest html) (but unfinished) to have at the top of the table for each teacher and each class the number of hours included and not included in order to understand where the problems are.
3969And have a file fet also not complete to import into Excel to be able to work manually.
3970
3971229---------------------------------------------------------
3972From Volker Dirr:
3973
3974About adding constraints students/teachers interval max days per week:
3975
3976I think you should clarify it in the interface: In FET you call it only
3977"interval start hour" and "interval end hour", but you might say better
3978"start at beginning of hour" and "end at end of hour" (or "until end of hour").
3979
3980230---------------------------DONE--------------------------
3981
3982231---------------------------------------------------------
3983From Davide Cottignoli (on forum):
3984
3985I often need to input many activities with fixed time in working hours and I find the user interface very tedious.
3986It would be more simple if the dialog is divided in two parts a follow:
3987On the left a list of activities (not the combo-box or drop-down box).
3988On the right a table grid with hours and day and the permission to mark only a square of the grid.
3989
3990In many other dialogs with the same scheme (for example in "add teacher not available times") it would be useful to have the list instead of the drop down box.
3991
3992232---------------------------------------------------------
3993From Davide Cottignoli (on forum):
3994
3995Implement lock/unlock of activities from a specific building.
3996
3997233---------------------------------------------------------
3998From Volker Dirr and Liviu Lalescu:
3999
4000About coloring the three timetable view dialogs:
4001
4002Volker:
4003A combobox with "disabled" as first item should be perfect for that task.
4004
4005Coloring produces sadly pretty many very similar colors. That should be
4006fixed. (for example by skipping similar colors or calculating a fixed
4007difference between colors.)
4008
4009Liviu:
4010The user can wish to choose the coloring of each view, in a settings menu:
4011Color teachers view by: Students, Subject, Tag, etc., or disabled, etc.
4012
4013234---------------------------------------------------------
4014From Luigi Valbonesi:
4015
4016When fet generates timetables, to run a parallel routine that saves
4017every new generated timetable (the best possible at the moment)
4018overwriting the previous and the most difficult ativities with the one
4019that blocked the generation. If the computer crashes there will be some
4020data to think about and work with.
4021
4022235---------------------------------------------------------
4023From fernandolordao and Volker Dirr (on forum):
4024
4025fernandolordao:
4026By default, teachers time constraints are permanently shown at same sequence that we add.
4027It would be useful if we could sort them by teachers' name in order to reduce time wasting for systematic modifications in time restrictions for many teachers. By the proposed way we could do modifications teacher-by-teacher following the name sequence without having to apply filter for each of them.
4028Similar sort options could be designed to other restrictions.
4029
4030Liviu Lalescu:
4031I'd suggest you to go to "All time constraints" dialog, filter "Contains" "Teacher not available", then "Sorted". Because the weight is always 100% and the teacher is after the weight in the constraint description, it works
4032
4033Volker:
4034The request is to save time. You don't save time if you always need to click a filter, write some stuff and also click sort. Very unhandy.
4035
4036In fact nearly all constraints and activities should be sorted. For TODO:
4037
4038Add a new dialog in FET->advanced->sort
4039
4040there should be checkboxes and a sort pushbutton.
4041the checkboxes should be:
4042sort teacher constraints by teacher names.
4043sort students constraints by students names.
4044sort room constraints by room name.
4045sort teacher names of all activities
4046sort students names of all activities
4047sort activity tags of all activities
4048
4049236---------------------------------------------------------
4050From Wizard (on forum):
4051
4052Wizard:
4053
4054Is there a way to set a minimum distance between first teaching hour and last teaching hour?
4055I have set maximum hours continuously to be 4, but sometimes the generated timetable contains a teacher that teaches 4 hours in a day and they become consecutive. What I would like is for him to be at school for at least 5 hours even if he has a gap.
4056
4057Liviu Lalescu:
4058
4059Unfortunately, I think this is impossible. I am not sure it can be implemented in the FET algorithm.
4060
4061237---------------------------------------------------------
4062From Volker Dirr:
4063
4064maybe for the TODO:
4065simplify the FET interface.
4066it is currently much to confusing if you work with it.
4067There are many constraint for a single teacher and all teachers.
4068it's unhandy to always check 2 lists.
4069in fact there is normally only a single "all" constraint.
4070in fact this suggestion should be done similar to students and rooms.
4071
4072but i explain now with a single example, so it's easier to explain:
4073there are 2 dialogs:
4074fet -> data -> time constraints -> teachers -> max gaps per week for a
4075teacher
4076fet -> data -> time constraints -> teachers -> max gaps per week for all
4077teachers
4078
4079it should be only a single dialog:
4080fet -> data -> time constraints -> teachers -> max gaps per week
4081the dialog is similar to the current one. just ordered. first the "all"
4082constraints, then the "single" constraints.
4083
4084that will help much, since you only need to check a single list now and
4085it is still ordered, because the "all" will be always the first.
4086this save a lot of space in the fet main window interface.
4087
4088then there are 2 ideas how to implement it.
4089idea a)
4090fet -> data -> time constraints -> teachers -> max gaps per week
4091can stay as "fet -> data -> time constraints -> teachers -> max gaps per
4092week for a teacher" currently is.
4093the "add" button must be renamed to "add one". And a "add all"
4094pushbutton must be added.
4095
4096idea b)
4097we can also remove a lot of dialogs. in this example:
4098remove
4099fet -> data -> time constraints -> teachers -> max gaps per week for all
4100teachers
4101
4102then only modify
4103fet -> data -> time constraints -> teachers -> max gaps per week for a
4104teacher
4105the combobox of this dialog only need a "all teachers" as first item.
4106
4107i prefer variant b, because it will save a lot of code, memory,
4108translations, ...
4109
4110238---------------------------------------------------------
4111From Volker Dirr:
4112
4113The activity description must be more detailed.
4114
4115Example:
4116If i check FET->Data->time constraint->activities->min days between
4117activities
4118the right information box is not detailed enough. i need to more
4119information if i want to decide if the activity should keep 100% or if i
4120can reduce it.
4121i need to know also the Duration.
4122So instead of for example:
4123Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a)
4124Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a)
4125
4126it should display:
4127Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:1)
4128Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1)
4129
4130because in that case i will keep maybe reduce the weight of that
4131constraint down to 0%.
4132
4133but is it for example this:
4134Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:2)
4135Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1)
4136
4137then i will never reduce it under 100%, because a 3 hour activity is to
4138long.
4139
4140239---------------------------------------------------------
4141From Volker Dirr:
4142
4143Shorten the strings in conflicts.txt. They are much too long. Very
4144confusing if you read that. (Maybe use shortcuts, sort them by type and
4145call the type only at the beginning of the list, ... There are many
4146variants to write it more clear.)
4147
4148240---------------------------------------------------------
4149From Davide Cottignoli (on forum):
4150
4151I have this simple suggestion that would, in my case, save a lot of time:
4152
4153I have some teachers that bind their worktime to an already built timetable, so they look at various activities and decide to work in those hours.
4154Often this happens when teachers are in co-presence in laboratory or when teachers have students with disabilities and need to support them when specific subject are in time.
4155So, it is the best to "double click" on the subactivity, on the interface with the generated timetable, to show the dialog that modify the subactivity and add the new teacher.
4156Then regenerate all the timetable to obtain the new HTML even for these teachers.
4157Whitout this simple "double click" I need to write down the number of the sub-activity, go to Data->Activities then looking for that number, click "modify" then add the teacher.
4158
4159Is it possible to do this and speed-up data enter?
4160
4161241---------------------------------------------------------
4162From ant7 (on forum):
4163
4164I do some tricks to make pair of activities to be
4165scheduled the same time but in two neighbouring days.
4166Because of that I need the constraint:
4167Fixed number of days between activities (with default value equal to 1).
4168
4169To achive it I use:
4170Minimum number of days between activities (set to 1)
4171 and
4172Maximum number of days between activities (set to 1)
4173so
4174
4175t1-t2>=1day   and   t1-t2<= 1day    give  t1=t2 + 1day
4176
4177Could you add this constraint?
4178Fixed number of days between activities (with default value equal to 1).
4179
4180When I have to click hundreds of times  Min and Max... constraints
4181I would save a lot of time if you add this constraint.
4182
4183Also from abautu, on forum: A constraint "Exact N days between activities" would imply "Min N days between activities"
4184AND "Max N days between activities". I use these two constraints simultaneously in order to force two activities to be
4185scheduled in same week days (in an odd/even timetable).
4186
4187242---------------------------------------------------------
4188From Lizio (on forum):
4189
4190Lizio:
4191
4192What about adding a new value to activities that is difficulty (let say 0=very easy like PE, 1=easy like art, 2= medium, 3=difficult and 4=very difficult like calculus), then it would be possible to add a constraint on maxximum difficulties per day in order to avoid "impossible days" for students.
4193
4194Liviu:
4195
4196Maybe you could add activity tags to activities, and use the constraint students activity tag max hours per day?
4197
4198Lizio:
4199
4200Unfortunately it would not work. It is not a matter of a max number of hours per day of a subject or a group of subjects, but not to sum too many difficult subjects in a day and your suggestion would work only if you define subjects as difficult or not, but I think it is better to define them with more levels.
4201
4202For example, you can have physical education that is easy and history that is harder but not so hard, math that is the hardest, so 2 hours of history is like one of math and so on, if you define a maximum difficulty of, let's say 7, you can plan 2 hours of math (3+3) and then you must plan 2 of physical education (0+0) and one o art (1), then you can plan a day with 2 hours of literature (2+2), one of history (2) and one of art (1) and so on and you don't risk to plan 2 hours of math (3+3) than 2 of literature (2+2) and one of history (2) and a day with 2 hours of PE (0+0), 2 of art (1+1) and one of history (2).
4203
4204Probably to make this improvement is a matter of a lot of coding and the improvement is not worth the effort to do it, but I don't know.
4205
4206Liviu:
4207
4208I understand. Do you know that you can add more activity tags for an activity? Also, you could add more constraints students activity tag max hours daily for the same students. Maybe these can help.
4209
4210To consider a sum of weights might be too difficult to implement.
4211
4212243---------------------------------------------------------
4213From Lizio (on forum):
4214
4215come posso fare a dire a FET che deve mettere due attività concomitanti, ma non fissate, bensì scelte da un insieme?
4216
4217Facciamo un esempio:
4218La palestra deve essere occupata per forza da due classi contemporaneamente e per farlo l'ho dichiarata come due aule distinte, ora vorrei che una prima fosse in palestra con un'altra prima e non, magari, con una quinta.
4219Le ore di ginnastica sono tutte attività separate e ho messo il vincolo di spazio sulle due palestre fittizie, FET mi alloca bene le cose, ma le classi sono mescolate, ora vorrei provare ad avere prime con prime, seconde con seconde, ecc.
4220
4221Qualche soluzione che non comporti il numero totale di classi al quadrato di vincoli da scrivere? (Ho 31 classi da piazzare e scrivere 900 e passa vincoli è proibitivo)
4222
4223---
4224
4225I have 4 1st grade classes, 4 2nd grade, 6 3rd grade, 4 4th grade and 2 5th,  I have 1 gymn and it must be used by 2 classes at the same time, so I created "palestra1" and "palestra2" and I have put the space constrain on each activity of physical education to be tought either in palestra1 or in palestra2.
4226
4227Now I want in the gymn 2 classes of the same grade and not 2 of different grades.
4228
4229The problem is that in my school we have 31 classes...
4230
4231I don't want to put toghether 2 classes of my choice as this would be a real hard constrain to be managed.
4232
4233244---------------------------------------------------------
4234From Arsenio Stabile:
4235
4236He has a custom version, so that if he has minimum gaps between building changes = 1,
4237if a teacher name ends in " AB", if he changes buildings from hour 3 to 4 from
4238a building ending in " A" to a building ending in " B", the gap is no longer necessary.
4239
4240Liviu Lalescu:
4241
4242I am sorry, but this kind of constraint is too specialized. I cannot
4243think of a name and good implementation for everybody to use it. I
4244think I'll add your suggestion in the TODO list.
4245
4246About you choosing the hours - this can made on your custom version,
4247but again I am not sure about a good way to present it to the user.
4248
4249Arsenio:
4250
4251In Italy it often happens that a school is divided into two buildings
4252one hour away for which is required a gap for the exchange and this
4253creates a major constraint. Some time ago I saw a commercial program
4254that provides the opportunity to do so now the gap is not attributed
4255to a teacher if the change takes place in the building at a certain time.
4256
4257245---------------------------------------------------------
4258From ant7 (on forum):
4259
4260After timetable generation
4261in timetable tab (teachers, students etc.)
4262I can see which activities are time or space locked ( I see LT or/and LS acronims)
4263and I can toggle these constraints for one or more activities whith mouse highlighting.
4264It would be very usefull If I can see the same signature in HTML files.
4265When I updates timetable many times on website
4266I would like to tell people that some their activities are already fixed time or place.
4267It should be some general option in FET allowing user to decide wether show this tags or not in HTML files.
4268When timetable is finished it should be easy switched off visibility of the two tags in all timetable in HTML files.
4269I don't want to insert these tags manually in activity dialog because it is some cumbersome.
4270
4271246---------------------------------------------------------
4272From Nguyễn Hữu Duyệt (on forum):
4273
4274Activate/deactivate more activities at once.
4275
4276247---------------------------------------------------------
4277From Volker Dirr:
4278
4279rethink about all used QList stuff in generate.cpp (in FET version 5.28.3)
4280
4281examples:
4282
4283Line 293: QList<int>& conflActivities
4284conflActivities is used only to check "contains". So isn't a QSet better/faster?
4285
4286Line 1990:
4287QList<int> occupiedRoomsList;
4288
4289it is only used for a foreach. So maybe a QStack or QQueue is better/faster?
4290
4291So maybe all should be rechecked.
4292
4293Liviu: You are right. The first part is more important, but I also need the
4294same order of the conflicting activities, as they are added. So I could
4295add a QSet and a QList together. But this will require more memory
4296allocation and operation. I am not sure.
4297
4298248--------------DONE since FET-5.41.0 on 2019-11-20--------
4299
4300249---------------------------------------------------------
4301From Handaya:
4302
4303DONE since FET-5.29.0 on 15 March 2016 --> 1) what if the html result be colorful also as in the program ?
4304(This point was also suggested by hudrea and by Udo Schütz). <-- DONE
43052) what if the colors be the same for the same teacher ?
43063) what if the program allows marking a weekly meeting for all teachers
4307without printing every name in the cell of timetable result ?
43084) what if the timetable result be printable or saveable in some diferent
4309formats like doc and pdf ?
4310
4311Liviu:
4312
4313DONE since FET-5.29.0 on 15 March 2016 --> (1) - The HTML results can be colored by using the CSS file. It is too
4314difficult for us, the programmers, to color them as in the FET
4315interface. <-- DONE
4316
4317(2) - In the interface, the colors are the same for the same
4318subject/subject+students set. This is what we came to after some
4319thinking.
4320
4321(3) - This would be possible, but I would need to keep in the .fet data
4322file an attribute which does not belong to timetabling, and I prefer
4323not to.
4324
4325(4) - .doc and .pdf - you could print the timetable to a pdf file, or
4326copy/paste the HTML code to a doc file.
4327
4328250--------------------------DONE---------------------------
4329
4330251---------------------------------------------------------
4331From Bobby Wise:
4332
4333I suggest that perhaps an additional printout be added that displays
4334all the teachers that are not occupied in a particular period.
4335
4336So it is basically a Free Teacher timetable printout, but it does not have
4337any comments like "Must come earlier" or "Single gap", it just displays the
4338names of all the teachers who are not working in that period.
4339
4340252--------------------------DONE---------------------------
4341
4342253---------------------------------------------------------
4343From Benahmed Abdelkrim (on forum):
4344
4345Par fois quand on entre les activité, en se rend compte ensuite qu'on a oublié d'utiliser les étiquettes. Et on se trouve dans obligation de mentioné les activités une par une, ce qui fait perdre un temps précieux . Peut on donc actuellement montioné d'un seul coup un ensemble d'activités choisi?
4346Sometimes when you enter the activity, then realizes we forgot to use the tags (labels). And we are in obligation to mentione the activities one by one, which wastes valuable time. Can we therefore now Montione suddenly a selected set of activities?
4347
4348Liviu:
4349
4350I am not sure I understand. You mean you want to modify more activities at once? I can add this in the TODO list, if you want, just let me know. But I don't think I will implement soon.
4351
4352Benahmed Abdelkrim:
4353
4354oui, absolument, vous pouvez l'ajouter dans le fichier TODO, car cette fonction à mon avis est très utile, vue le temps quelle permet de gagner.
4355   a maintes reprises et après production d'un tableau par FET, et après vérification de celui-ci, on se rends compte qu'on est obligé de faire appel a une étiquettes(tags) pour réaliser une séparation dans le temps d'un ensemble d'activités.
4356  donc cette nouvelle fonction si elle voit le jour, permet de modifier les étiquettes(tags) d'un seul coup, et non pas comme elle actuellement une par une.
4357
4358   yes, absolutely, you can add it to the TODO file because this feature in my opinion is very useful for any time saves.
4359    has repeatedly and on production of a table by FET, and after checking it, we realize that we are obliged to call a labels (tags) to make a separation in time of a set activities.
4360   So this new feature if it is created, we can change the labels (tags) at one time, and not as it is currently one by one.
4361
4362254---------------------------------------------------------
4363From Benahmed Abdelkrim (on forum):
4364
4365 j'ai deux suggestions:
4366            la première:
4367   pourquoi ne ajouter dans le dossier fet-results, un fichier qui permet de savoir les horaires des salles vide?
4368  ce fichier va aider a mieux contrôler l'énergie électrique en éteignant la lumière le temps que ces salles soit vides.
4369  la deuxième:
4370               cette opération qui ce fait maintenant de façon manuelle. peut on la rendre automatique via un logicielle lié a FET?
4371
4372I have two suggestions:
4373  the first:
4374                why not add in the folder fet-results, file that lets you know the times of empty rooms? as the file: Teachers Free Periods
4375                This file will help better control the electric power by turning off the light as long as these rooms is empty.
4376  the second:
4377                   this operation that now done manually. can we make it automatic via a software related to FET?
4378
4379Volker Dirr:
4380
4381about first suggestion:
4382Rooms Free Periods: In my opinion only needed if you want to swap a room. I think i can add it if Liviu agree.
4383On the other hand you can already do it today with TiTiTo (selecting empty rooms; swap rooms; ...)
4384Also: in my opinion your suggestion doesn't help saving electric power. Only if you are able to control electric from distance or if there is a guy that always run through all rooms.
4385We save electric power very easy: We simply print the room table and put it on the door. So every teacher ans students can see if nobody will use the room in the next hour(s) and so they can turn off the light.
4386
4387about second suggestion:
4388i am not sure about what exactly you are talking. about printing free rooms table? see previous answer. Or about swapping a room? see previous answer? Or do you talk about something different?
4389
4390255---------------------------------------------------------
4391From math user (on forum):
4392
4393It would be great if "teachers", "subjects", ... would be customizable (settings). For universities "lecturers" and so on.
4394
4395256---------------------------------------------------------
4396From ChicagoPianoTuner:
4397
4398I have a feature request for FET: in the timetables menu after a successful
4399generation, there is a button to "lock/unlock" all activities when I'm
4400looking at a particular subgroup or teacher or room. If I click it, all
4401activities lock, and clicking again unlocks. I would prefer two separate
4402buttons, one for lock and one for unlock. The reason is sometimes I have 4
4403subgroups where they share many activities (but not all activities), and I
4404want to lock all activities for that particular group (or year) but cannot
4405do it all at once.
4406
4407Liviu:
4408
4409Unfortunately, there is not enough space in that dialog. But you can use the
4410timetable view time horizontal views.
4411
4412257---------------------------------------------------------
4413From MING-KIAN JONATHAN CEDRIC LEE KIM GNOK and Volker Dirr:
4414
4415All the users to start FET by double-clicking a .fet file (so that the FET executable won't complain:
4416"To start FET in interface mode, please do not give any command-line parameters to the FET executable.").
4417We could open in such a case the first file given as a command-line parameter to the FET executable.
4418
4419Liviu:
4420It is bad to mix the version accepting command-line parameters (fet-cl) with the one not accepting them (fet).
4421
4422258---------------------------------------------------------
4423From Benahmed Abdelkrim (on forum):
4424
4425FET can really import and export almost all data. except constraints. if this function can be done with FET, it will help save a lot of valuable time, and also allow a FET to communicate with other software..
4426
4427Liviu: It is a bit weird to export the constraints - what format to choose?
4428
4429Also suggested by sln_rj, on forum.
4430
4431259---------------------------------------------------------
4432From Benahmed Abdelkrim (on forum):
4433
4434write directly into cells Activity planning, especially for the activities which are not divided(not split).
4435for the activities that are divided, we can momentarily kept the weight by fefaut (95%), and later change it if we want.
4436
4437260----------------------DONE-------------------------------
4438
4439261---------------------------------------------------------
4440From Volker Dirr:
4441
4442a second rooms statistic:
4443
4444print all activities with the (maybe) used rooms.
4445but only an unordered list will be "bad" to read/check.
4446so there should be a not only a simple list.
4447there should be a filter to check faster.
4448so filter all activities by subject, teacher or students set.
4449
4450262---------------------------------------------------------
4451From Volker Dirr:
4452
4453add a new column in "fet -> Statistics -> Teachers Statistics"
4454the column get the name "teachers qualification".
4455so the user can see the the data that he entered.
4456
4457and:
4458
4459add a new column in "fet -> Statistics -> Subjects Statistics"
4460the column get the name "teachers qualification".
4461so the user can see the the data that he entered (indirectly).
4462
4463263---------------------------------------------------------
4464From math user (on forum):
4465
4466math user: It would be great if components / subactivities always get the same room (option).
4467
4468Liviu: You have the constraint activities occupy max 1 different rooms.
4469
4470math user: Yes, that is exactly how I have solved it. But I have to enter a condition for each activity
4471(lots of conditions). Therefore a (global) setting "same room for all components of an activity" would be nice.
4472
4473264---------------------------------------------------------
4474From Volker Dirr:
4475
4476at the end of the generating algorithm, so after all activities are
4477placed (but before locking the activities?!) there should be a simple
4478algorithm that cares about rooms "bugs". this algorithm must not be
4479perfect, it should only fix "bad" stuff.
44801) check if there is an activity without a room, even if it is got a space
4481constraint with weight less then 100%
44822) if there is an activity with a room, it should check if it is
4483possible to place a smaller room to this activity
44843) maybe repeat step 2 a few times to get a better result. (the result
4485might not be perfect, but it is ok.)
4486
4487265---------------------------------------------------------
4488From math user (on forum):
4489
4490It would be great if the user could change the default values for width and height (disabled and 8ex) in the settings: enable/disable and enter values (default: 8 and 8).
4491Like that, the user does not have to change the values manually after each generation.
4492
4493266---------------------------------------------------------
4494From Volker Dirr:
4495
4496Generating a difficult timetable shows 28 h... . Should it show 1 d 4 h... ?
4497
4498267---------------------------------------------------------
4499From daltinkurt (on forum):
4500
4501A constraint min days between activities, with force consecutive if same day = true. Can (should) two activities if on the same day span over a break?
4502
4503268---------------------------------------------------------
4504From Volker Dirr:
4505
4506maybe we can add a check for this:
4507
4508teacher max hours per day is lower than activity duration.
4509
4510269-------DONE since FET-5.34.0-(26 October 2017)-----------
4511
4512270---------------------------------------------------------
4513From auriolar (on forum):
4514
4515It would be nice to be able to limit the time a teacher is in the school.
4516
4517I mean, having, for instance, 5 days and 6 hours/day, I would like to have teachers no more than 25 hours each week in the school gaps included.
4518This asumes that the timetable is continuous each day, so if I have only class at the first hour and other at the last one, I've been 6 hours (not 2).
4519
4520I don't think max gaps per week will work (30-25=5), because some teachers have to be less than 25 hours, and those should have more than 5 gaps.
4521
4522Liviu Lalescu: It would be possible for the user to just consider the working hours for each teacher and add a corresponding max gaps per week
4523for each teacher (a solution which you partially imply).
4524
4525271---------------------------------------------------------
4526From auriolar (on forum):
4527
4528I think it would be a good idea to have tags for teachers, this way we could add constraints to groups of teachers instead of doing one by one.
4529Maybe it could be done for rooms to.
4530
4531272---------------------------------------------------------
4532From Bob Hairgrove (on forum):
4533
4534When I generate a timetable, I can successfully save it in CSV format. However, if I do not generate a timetable but open a .FET file from a previous session, it will export all of the data but without without any planned activities because "no timetable has been generated". So if I want to have CSV timetables, I have to remember to export them immediately after they have been generated.
4535
4536This would be a nice feature to have since there is the schedule contained in the "{Name}_activities.xml" file, and the export routine would only have to read it.
4537
4538Or is there a better way?
4539
4540Liviu Lalescu: Did you notice that there is a file name_data_and_timetable.fet in the results? You can open this file and generate on it - it will go very fast, and after that you can export the CSV results.
4541
4542273---------------------------DONE--------------------------
4543
4544274---------------------------------------------------------
4545From Benahmed Abdelkrim (on forum):
4546
4547Sometimes you need to see the "Activity tags" in tables produced by FET, but the tables are becoming so large; then the idea that surprises us right now is: why not allow the user to select only the "Activity tags" that wants to print ?.
4548
4549If this feature is created, the tables will be lightweight, and easy to read.
4550
4551275---------------------------------------------------------
4552From Anton Anthofer (see also item #151):
4553
4554- remove the "modify subactivity" menu and move that feature into the "normal" activity menu.
4555- modify the id
4556- recalculate the ids
4557- a complex calculation of the number of students.
4558- generate very similar timetables
4559
4560276---------------------------------------------------------
4561From Volker Dirr:
4562
4563a) Add also conflicting activities into
4564activitiesConflictingPercentage if there is a constraint with:
4565activities with min days between activities and weight 100%
4566two grouped activities with weight 100%
4567two consecutive activities with weight 100%
4568two ordered activities with weight 100%
4569min gaps between activities with weight 100%
4570
4571b) Check if it speedups if there is a QList/QSet timetable[hours_per_week] and
4572checking the activitiesConflictingPercentage at the very beginning.
4573because activitiesConflictingPercentage contains a lot of constraints.
4574
4575Liviu Lalescu: I think this is impossible/infeasible.
4576
4577277---------------------------------------------------------
4578From mercurialuser (on forum) (and similar, from JBoss, also on forum):
4579
4580In a few minutes I will have to stop FET and switch off my computer. I need to change some activity so it is not a problem but is it
4581possible to "pause" a run and "restart" it later, surviving a pc reboot?
4582
4583From JBoss:
4584
4585I was wondering if it was possible to stop and resume (at a later time) the generation of a timetable, for example if one needs badly
4586to switch off the PC but doesn't want to loose the N-hours of elaboration done so far.
4587
4588(Related to item #196.)
4589
4590278---------------------------------------------------------
4591From mercurialuser (on forum):
4592
4593If you can't change a value (usually a 100% setting, or allow empty days) please disable the widget... it is misleading...
4594
4595Rewording by mercurialuser:
4596
4597There are some constraints that must have the % field set to 100. Unfortunately the field is editable and it causes confusion, expecially for newcomers.
4598
4599I suggest to keep the field on screen but just disable it, make it not editable...
4600
4601279---------------------------------------------------------
4602From mrtvillaret (on forum):
4603
4604In the add constraint teacher not available dialog mark with "b" the slots in which there is a global break.
4605
4606Liviu Lalescu: also in students set or room not available and activity(ies) preferred times?
4607
4608280---------------------------------------------------------
4609From Lizio (on forum):
4610
4611It could be helpful to put disable and enable buttons in every windows about constraints, not only in the "All" ones.
4612
4613It could be helpful too to put those buttons also on windows about activities.
4614
4615281---------------------------------------------------------
4616From Lizio (on forum):
4617
4618I think it could be very helpful to let multiple selection in every window about data and constraints.
4619
4620In this way you can select some of them to apply actions with buttons.
4621
4622282---------------------------------------------------------
4623From Volker Dirr:
4624
4625Volker provided code for a faster generation if one uses constraints room not available times. But it is too risky for now.
4626Maybe in the future.
4627
4628Volker: Disalow timeslots of activities if a room is not available.
4629
4630Volker's code:
4631
4632...
4633Matrix2D<double> notAllowedTimesPercentages;
4634Matrix2D<double> notAllowedTimesPercentagesFromSpaceConstraints;
4635
4636//breaks are no gaps - I keep track of this
4637//bool breakTime[MAX_HOURS_PER_WEEK];
4638...
4639
4640...
4641	t=computeActivitiesRoomsPreferences(parent);
4642	if(!t)
4643		return false;
4644
4645	//Before computeFixedActivities(...)
4646	t=computeNotAllowedTimesPercentagesFromSpaceConstraints(parent);
4647	if(!t)
4648		return false;
4649	//////////////////
4650
4651	/////////buildings
4652	t=computeMaxBuildingChangesPerDayForStudents(parent);
4653	if(!t)
4654		return false;
4655...
4656
4657...
4658bool computeNotAllowedTimesPercentagesFromSpaceConstraints(QWidget* parent)
4659{
4660	Q_UNUSED(parent);
4661
4662	//Speed improvement (start) by Volker Dirr
4663	notAllowedTimesPercentagesFromSpaceConstraints.resize(gt.rules.nInternalActivities, gt.rules.nHoursPerWeek);
4664
4665	//TODO: check if this is correct
4666	for(int i=0; i<gt.rules.nInternalActivities; i++){
4667		for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
4668			notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=-1;
4669		}
4670	}
4671
4672	for(int i=0; i<gt.rules.nInternalActivities; i++){
4673		if(!unspecifiedPreferredRoom[i]){
4674			bool roomsWithWeight100Found=false;
4675			QSet<int> allowedRoomsSet;
4676			for(int kk=0; kk<activitiesPreferredRoomsList[i].count(); kk++){
4677				PreferredRoomsItem& it=activitiesPreferredRoomsList[i][kk];
4678				if(it.percentage==100){
4679					if(!roomsWithWeight100Found){
4680						allowedRoomsSet=it.preferredRooms;
4681						roomsWithWeight100Found=true;
4682					}
4683					else{
4684						allowedRoomsSet.intersect(it.preferredRooms);
4685					}
4686				}
4687			}
4688			if(roomsWithWeight100Found){
4689				if(!allowedRoomsSet.isEmpty()){
4690					for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
4691						bool noRoomAvailable=true;
4692						foreach(int room, allowedRoomsSet){
4693							if(notAllowedRoomTimePercentages[room][hour]!=100){
4694								noRoomAvailable=false;
4695								break;
4696							}
4697						}
4698						if(noRoomAvailable){
4699							if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){
4700								notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100;
4701							}
4702						}
4703					}
4704				} else {
4705					//TODO report a warning. There is no allowed slot at all
4706				}
4707			}
4708		}
4709		else{
4710			if(!unspecifiedHomeRoom[i]){
4711				if(activitiesHomeRoomsPercentage[i]==100){
4712					for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
4713						bool noRoomAvailable=true;
4714						foreach(int room, activitiesHomeRoomsHomeRooms[i]){
4715							if(notAllowedRoomTimePercentages[room][hour]!=100){
4716								noRoomAvailable=false;
4717								break;
4718							}
4719						}
4720						if(noRoomAvailable){
4721							if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){
4722								notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100;
4723							}
4724						}
4725					}
4726				}
4727			}
4728		}
4729	}
4730	//Speed improvement (end) by Volker Dirr
4731
4732	return true;
4733}
4734
4735bool computeMinDays(QWidget* parent)
4736...
4737
4738...
4739bool computeFixedActivities(QWidget* parent)
4740{
4741	bool ok=true;
4742
4743	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
4744		int notAllowedSlots=0;
4745		for(int tim=0; tim<gt.rules.nHoursPerWeek; tim++)
4746			if(notAllowedTimesPercentages[ai][tim]==100 || notAllowedTimesPercentagesFromSpaceConstraints[ai][tim]==100)
4747				notAllowedSlots++;
4748
4749		if(notAllowedSlots==gt.rules.nHoursPerWeek){
4750...
4751
4752...
4753	s+=GeneratePreTranslate::tr("End - the order of activities (id-s)");
4754	s+="\n";
4755	initialOrderOfActivities=s;
4756
4757	if(initialOrderStream!=nullptr){
4758		(*initialOrderStream)<<s;
4759		(*initialOrderStream).flush();
4760	}
4761
4762	//After computing the initial order, because it is already taken care of.
4763	//Speed improvement (start) by Volker Dirr
4764	for(int i=0; i<gt.rules.nInternalActivities; i++)
4765		for(int t=0; t<gt.rules.nHoursPerWeek; t++)
4766			if(notAllowedTimesPercentagesFromSpaceConstraints[i][t]==100)
4767				notAllowedTimesPercentages[i][t]=100;
4768	//Speed improvement (end) by Volker Dirr
4769}
4770...
4771
4772283--------------DONE since FET-5.41.0 (2019-11-16)---------
4773
4774284---------------------------------------------------------
4775From alienglow (on forum):
4776
4777Could you please add a setting to display the full file path of the data file in the title bar.
4778e.g. Instead of showing just "datafile.fet" if there can be a setting to display "D:\Data\FET\datafile.fet".
4779You can also think of doing this via a status bar, where if possible more info can be displayed.
4780For the statusbar you can have display options like - data file name, current output directory etc.
4781
4782285---------------------------------------------------------
4783From mercurialuser (on forum):
4784
4785In order to avoid that 3rd grade classes with 10h subject (3 2 2 1 1 1 or variants as we spoke in other thread) have more than 3 hours in one day I add a tag MAX3 to all that activities.
4786
4787I then added a "TEACHER max hour per day with a tag" constraint set to 3.
4788
4789All the test run with (where I disable the most strict constraints) completed the timetable.
4790
4791When all the constraints were enabled, no way to go upper than a value, in all the runs.
4792
4793I finally traced the problem to a teacher that has 2 10h subjects, so 20 hours... in a 5 days timetable it means at least 4 hours per day....
4794
4795I moved the constraint to Students....
4796
4797I think that this condition can be found at pre-compute... sum of the hours of all the splits with the tags / number of working days should be <= max daily hour with tag
4798
4799286---------------------------------------------------------
4800From noddy11:
4801
4802He asks if there is an easier way to activate/deactivate activities. It is to complicated since he needs do it many times.
4803A first solution might be that the "active" checkbox in activities will be related to all subactivities. Activating subactivities only by the modify subactivities form.
4804An other solution might be activating similar to the activating of constraints.
4805
4806287---------------------------------------------------------
4807From Davide Cottignoli (on forum):
4808
4809Is it possible to add a lock/unlock menu for all activities placed in a specific building and a lock/unlock menu for all activities with a specific key?
4810This can speed up manual adjustment when a timetable is generated and, virtually, can speed up the locks for any activities aggregation.
4811
4812288---------------------------------------------------------
4813From Devrim Altınkurt (on forum):
4814
4815 think, maybe you can think about only place AN ACTIVITY (not two acts / subacts) over a break.
4816i know it is diffucult problem. but i know there are another schools which want you do this in Turkey.
4817maybe you add an option ([ X ] can place over a break) for each activity (not subacts)
4818and the users can choice if the lesson place like this or not.
4819
4820289---------------------------------------------------------
4821From Davide Cottignoli (on forum):
4822
4823He suggests that it is possible for the user to change from LT (locked time) to PLT (permanently locked time) and viceversa and from
4824LS (locked space) to PLS (permanently locked space) and viceversa, from the timetable view dialogs, by selecting cells.
4825
4826290---------------------------------------------------------
4827From Devrim Altınkurt (on forum):
4828
4829i think there is a bug about "Activity tag preferred room(s)" constraint.
4830i attached a fet file. you can take a look at it.
4831
4832bug steps:
4833
4834    time table: 1 day and 12 hours
4835    added some lessons, student groups, ...
4836    added 13 activities with 1 hour to different subgroups and subjects
4837    added a tag to all activities
4838    added an "Activity tag preferred room(s)" with this tag and one room.
4839    there is not enough room but FET don't detect this.
4840
4841Liviu Lalescu:
4842
4843It is not a bug, it is more like a suggestion.
4844
4845291---------------------------------------------------------
4846From thanhnambkhn (on forum):
4847
4848When investigating Fet command line source code, I see there are 2 types of return value: return 0 or 1 (fet.cpp), therein:
4849- Value "1" means error (can not generate time table) always.
4850- But value "0" somewhere mean success, but somewhere mean error (when time exceed or abort). (fet.cpp - line 1380)
4851
4852I think, "0" should mean "success" only. In order to do that, we should add "return 2;" when time exceed or abort. (fet.cpp - if/else - line 1239)
4853
4854Liviu: I consider that my way of treating this is better.
4855
4856292---------------------------------------------------------
4857From Malamojka (on forum):
4858
4859Notebook:
4860
48611. Could you add something like "Notepad" where you could write down various comments for yourself for current version of a timetable. It could be opened all the time and saved when you save the timetable.
48622. I really like "comments" of each activity, but I miss a possibility to add a comment when you create an activity (you have to create it, then go to Data/Activities, find the activity and then add comment.
48633. As I said, I really like comments, so I'm also missing a shortcut to create a comment on Time/Space constraints: I would like to be able to add comment, when I add a constraint (now I have to filter/find a constraint in Time/All or Space/All and then add a comment).
4864
4865293---------------------------------------------------------
4866From Malamojka (on forum):
4867
4868I was looking for a way to "hide" some of tags in the timetable (I want some to be visible, but not all). As far as I can see you can do this by changing a certain file in program data folders. I was wondering if the same could be done by, say, naming tag "not wanted tag" in form "(*not wanted tag*)" (so basically adding (* in front of a tag name and *) at the end of tag name). So a tag of that form wouldn't be seen in timetable html. If a solution like that already exists, then I apologize (it didn't exist the last time I checked). Please let me know.
4869
4870294---------------------------------------------------------
4871From Malamojka (on forum):
4872
4873When you generate a timetable, you have to select output directory in Settings/Select output directory. Could there be a possibility you could check/choose, so "Output directory" would automatically be directory, where your *.fet file is saved.
4874
4875295---------------------------------------------------------
4876From Malamojka (on forum):
4877
4878Four suggestions on constraints:
48791. Would it be possible to add: space -> Activities -> An activity has a preferred building. It would help me a lot.
48802. Could you add: time -> Activities -> An activity either starts or ends students day (for when they don't actually do the activity for the entire semester)?
48813. Is it possible to have variable weight on teachers not available time (for their ideal time, set at maybe 99%)?
48824. Could you add: space -> Activities -> A set of activities has a set of preferred rooms? (there are several subjects with a certain tag that I want in just a few rooms).
4883
4884Liviu:
4885
48861. You can add a new tag, then constraint activity tag preferred rooms, then add this tag to all implied activities. It should be easy.
48872. No. It is impossible to add in the algorithm. Maybe you could duplicate the students set and add all the activities which are taken the entire semester. This way, if the duplicated students set has max gaps 0, it will force what you want.
48883. Please use constraint activities preferred time slots.
48894. Activities preferred room(s) is not possible (the constraints are not correctly understood when you mix subject preferred room(s) with teacher preferred room(s)). But why don't you use subject+activity tag preferred room(s) or activity tag preferred room(s)? You can add more tags and constraints for an activity.
4890
4891For point 2. please see also item #364.
4892
4893296---------------------------------------------------------
4894From Malamojka (on forum):
4895
4896My subjects have their own ID for the sake of our system (I'm talking about few activities with same subject and different teachers). Is it possible to import subject names and IDs? We sometime have two subjects with same name but different ID. Timetable for subjects puts those two in same timetable and adding an ID could solve that problem (subjects' timetable could be composed on the basis of subjects IDs and not name).
4897
4898297---------------------------------------------------------
4899From thanhnambkhn (on forum):
4900
4901From my point, I see that FET-cl is very compact (minify) compare to FET-desktop. Most of people care about FET-desktop only, I do not.
4902I think you should consider design Fet in the future in this way:
4903- FET-cl is core
4904    + With many options, apis,
4905    + Allow to extend or customize but keep work with the official
4906    + With standard output (xml, json ...)
4907- FET desktop (or any other App) is only front-end, calls to these Fet-cl 's api.
4908By this way, FET will able to more useful, and able to use in many cases, many projects. They can use Fet GUI or not. (it is my case)
4909
4910298---------------------------------------------------------
4911From canhathuongnhau and Volker Dirr (on forum):
4912
4913Volker:
4914
4915The dataset is impossible.
4916It is very easy to prove that.
4917Please check teacher T.
4918That teacher is teaching 24 hours.
4919Now check his activities. All activities should be in the morning. In the morning are only 5*5=25 free time slots. But you set also 2 breaks in
4920the morning. So there are only 25-2=23 slots left.
4921It is impossible to set 24 hours into 23 free slots.
4922
4923Could we add a test for this?
4924
4925Liviu:
4926
4927It is easy to add such a test for such a case, but there are many more other situations in which this test will not work. Like there are more "groups" of
4928activities, each one with its preferred time slots.
4929
4930299---------------------------------------------------------
4931From Volker Dirr:
4932
4933don't always break/disallow generating if there is a warning at the
4934beginning. that is pretty bad. sometimes FET gives warnings, even if the
4935dataset is solveable. (For example if you add an activity tag, but no
4936activity is using that activity tag). i like that FET is reporting this
4937potential bug. But the FET behavior is bad, since
4938it shouldn't disallow generating.
4939
4940also maybe rethink about printing all warnings into a single
4941string/editor. since by this i can copy and paste those warnings and fix
4942them all at one. at the moment i always need to read and fix it always
4943step by step (because i can't remember always all reported bugs, especially
4944if i check datasets from other users and or if i can't even read the
4945characters (Arabic, Russian, ...)
4946
4947300---------------------------------------------------------
4948From Jijo Jose:
4949
49501.  Export the result to Excel format
49512.  Add xml dtds for xml display
4952
4953301---------------------------------------------------------
4954From Julio González Gil (on forum):
4955
4956Rephrased by Liviu Lalescu:
4957
4958We need more preliminary tests for the constraint teacher(s) min hours daily, to avoid
4959unnecessary work to discover the bugs. For instance, if we have teacher(s) min 2 hours daily
4960with allow empty days, and:
4961
4962- The teacher is only available one hour on a day, or
4963- The teacher has one activity divided into two components, 100% min 1 days between them,
4964each component having duration 1.
4965
4966302---------------------------------------------------------
4967From Volker Dirr:
4968
4969generate multiple: instead of a fixed max time use a more flexible max
4970time. "Calculate max X minutes longer than the time the last max
4971activity was placed" or "Countdown x minutes if no new max placed
4972activity was found"
4973so for example thre is a countdown timelimit with 5 minutes.
4974as soon as a new max placed activity was found the counter restarts at 5
4975minutes.
4976  so the time limit is 5 minutes.
4977
4978303---------------------------------------------------------
4979From Julio González Gil (on forum):
4980
4981If we are sure that nobody can teach less hours than the global constraint (for all teachers), another option is to mark as unavailable the days for the teacher(s) with problems.
4982
4983For example if we have "min hours per day = 2" for all teachers, and TeacherA has Wednesday with only one free hour (time slot), it is clear we can mark the whole Wednesday as not available (as it won't be used anyway).
4984
4985---
4986
4987Liviu Lalescu: Maybe also for students?
4988
4989---
4990
4991Volker Dirr:
4992
4993a) fet should show a "speed warning" only. so user can modify hisself
4994or
4995b) fet should automatically disallow those timeslots for related activities. but this is a bit critical. (i wrote similar stuff for rooms and same starting time constraints but we didn't added it yet, since there where small problems with other example file. i think they only happen since the free time slot check where done after the "set disallowed" even if it must be done before. but that mean we must split that in the source, since currently Liviu done both very close at the same time.)
4996
4997---
4998
4999Julio González Gil:
5000
5001I would go with option A, with a warning for each problem found. In my opinion it's better to allow the user to fix it and least you are sending a warning to the user about the speed (I'd mention that in this case you can even have impossible timetables as it was in my case).
5002
5003---
5004
5005Liviu Lalescu:
5006
5007The code could look like:
5008
5009			for(int d=0; d<gt.rules.nDaysPerWeek; d++){
5010				int nFreeSlotsDay=0;
5011				for(int h=0; h<gt.rules.nHoursPerDay; h++){
5012					if(!teacherNotAvailableDayHour[tc][d][h])
5013						nFreeSlotsDay++;
5014				}
5015				if(nFreeSlotsDay>0 && nFreeSlotsDay<teachersMinHoursDailyMinHours[tc]){
5016					ok=false;
5017
5018					int t=GeneratePreIrreconcilableMessage::mediumConfirmation(parent, GeneratePreTranslate::tr("FET warning"),
5019					 GeneratePreTranslate::tr("For teacher %1, the constraint min %2 hours daily is useless on day %3. Please make this "
5020					 "teacher not available on this whole day, for performance and better correctness checking.")
5021					 .arg(gt.rules.internalTeachersList[tc]->name)
5022					 .arg(teachersMinHoursDailyMinHours[tc])
5023					 .arg(gt.rules.daysOfTheWeek[d])
5024					 ,
5025					 GeneratePreTranslate::tr("Skip rest"), GeneratePreTranslate::tr("See next"), QString(),
5026					 1, 0 );
5027
5028					if(t==0)
5029						return false;
5030				}
5031			}
5032
5033to be added at the end of the function "bool computeTeachersMinHoursDaily(QWidget* parent)" of file src/engine/generate_pre.cpp.
5034
5035304---------------------------------------------------------
5036From jillali elghazoui:
5037
5038(Also suggested by bachiri401 and Benahmed Abdelkrim)
5039
5040In the Add activity dialog, add a check box near Selected (students) list widget. The check box may be called "Activities separately"
5041and, if selected, will add more activities, one for each selected students set.
5042
5043Liviu Lalescu: I am so sorry, but I think it is not a good thing to add in the official version. It will complicate unnecessarily the interface.
5044However, this feature was added in the customized versions for Algeria and Morocco.
5045
5046305-----------------------DONE------------------------------
5047
5048306---------------------------------------------------------
5049From Volker Dirr (on forum):
5050
5051Teacher(s) max gaps continuously (a constraint that limits the number of continuous gaps).
5052
5053Liviu Lalescu: seems difficult. But you may use a trick: add a dummy activity with duration 1 for each allowed gap for the teacher,
5054with activity tag "gaps", then make max gaps per week for that teacher 0, then use constraint teacher max hours continuously
5055with activity tag "gaps".
5056
5057Volker Dirr:
5058
5059The workaround is fine for the full time teachers at my school; but it is bad for part time teachers, since the workaround affects
5060also the min/max number of hours per day and also the number of days per week.
5061
5062307---------------------------------------------------------
5063From math user (on forum):
5064
5065The links to each table (#table_12) are great.
5066The only problem is that the link for a certain teacher changes when another teacher is added or removed.
5067
5068---
5069
5070Why not keep #table_12 and so on and just make them permanent (associated to a certain teacher, group, room, ...)?
5071Say #table_12 belongs to teacher Abc: The ID #table_12 is stored for this teacher. Suppose the last stored ID is #table_50.
5072Adding a new teacher will result in ID #table_51 being associated with that teacher, and so on.
5073Removing say teacher with ID #table_34 will make no changes, i.e. the next new teacher gets ID #table_52.
5074
5075There should be a setting to change between consecutive IDs (default - as in the current version) and permenent IDs (my suggestion).
5076When switching from permanent to consecutive, all IDs are reallocated when the timetable is generated.
5077
5078---
5079
5080Liviu Lalescu:
5081
5082Unfortunately, I think this is (very?) complicated.
5083
5084---
5085
5086Rodolfo Ribeiro Gomes:
5087
5088Maybe a hash of room name?
5089table_roomXXXX where XXXX is a hash?
5090
5091---
5092
5093Liviu Lalescu:
5094
5095I thought of this, too. But there might appear conflicts, and solving them is not easy. Also, numbers are nicer than a hash value.
5096
5097---
5098
5099Rodolfo Ribeiro Gomes:
5100
5101Another option is to convert room/subject/teacher/etc. name to URL encoding? Like http://doc.qt.io/qt-5/qurl.html#toPercentEncoding
5102
5103---
5104
5105Volker Dirr:
5106
5107that will avoid duplicates.
5108advantage is the permanent link.
5109disadvantages are that Arabic (and other) users will have trouble to read it and the file size will grow.
5110
5111---
5112
5113Liviu Lalescu:
5114
5115I think white spaces should also be encoded, which is not done by default?
5116
5117But I would not like to implement this in the official version. I prefer the numbers, they are much shorter and nicer. And maybe safer.
5118
5119I can add this in the TODO, and if more people ask, I will reconsider.
5120
5121308---------------------------------------------------------
5122From math user (on forum):
5123
5124He refers to the all time/space constraints dialogs:
5125
5126What about CTRL+F to select Filter and CTRL+G to select Sorted? That would speed up usage (keyboard only - no mouse needed).
5127
5128309---------------------------------------------------------
5129From Rodolfo Ribeiro Gomes (on forum):
5130
5131Constraint teacher(s) min continous gaps in window (for instance, the teachers should have 6 continuous gaps on a day, for lunch, when
5132the FET time slot corresponds in reality 10 minutes).
5133
5134310---------------------------------------------------------
5135From Matsumoto (on forum):
5136
5137Is LibreOffice exportation planned? Quite a lot of people I present FET to have little to no knowledge about HTML / CSS editing, so being able
5138to export the timetables in LibreOffice would really help spread FET around my area.
5139
5140See also TODO item #18
5141
5142311---------------------------------------------------------
5143From Matsumoto (on forum):
5144
5145To help see difficult days/times, FET could have a statistics that shows the amount of available teachers at every period of the timetable,
5146for example, if only teachers A, B, C and D are available at the first hour of every day, I imagine it should show something like:
5147
5148	Day 1	Day 2 	Day 3
5149Hour 1	4	4 	4
5150Hour 2	6	2 	4
5151
5152I filled in random values for hour 2 just to have more detail
5153
5154This should allow the user to quickly spot times where more teachers could be needed before the generation starts. Maybe in addition to the
5155number of teachers also have the names?
5156
5157From Volker Dirr:
5158
5159we can skip this dialog, since it is still too much work to check; it
5160can be improved much more!
5161
5162add a new (locked) feature:
5163"check min teachers per slots (except breaks)"
5164Here a user can enter the number of classes (or: if smaller: the number
5165of courses).
5166
5167Than in generate_pre it is always checked by default if that minimum
5168number is fulfilled or not.
5169
5170Advantage: you don't always need to check manual
5171number_of_slots_per_week every time you added/modified a constraint. You
5172only need to add that number one time and it will always check
5173automatically.
5174
5175312---------------------------------------------------------
5176From Vangelis Karafillidis:
5177
5178New constraints:
5179
5180Teacher(s) max span per week;
5181Teacher(s) min span per day;
5182Teacher(s) min span per week;
5183Teacher(s) min gaps per day;
5184Teacher(s) min gaps per week;
5185A set of activities has min common time slots with another set of activities ( https://lalescu.ro/liviu/fet/forum/index.php?topic=3101.msg16795#msg16795 )
5186
5187DONE SINCE FET 5.41.0 on 2019-11-16: Min simultaneous activities from a set in selected time slots.
5188
5189DONE SINCE FET 5.41.0 on 2019-11-16: A set of activities occupies min time slots from a selection.
5190
5191Also suggested by auriolar, on forum: Teacher(s) max span per week.
5192
5193313---------------------------------------------------------
5194From Silver (on forum):
5195
5196I suggest you add the split and duration in subject window, why we add the split and duration when we add activity for 1st teacher, and for 2nd teacher ... .
5197With this suggestion, we add the splits and duration 1 time for the subject.
5198Exmple: Physics1 have 2 split in the week, so why I add this info in every activity for Physics1?!
5199
5200314---------------------------------------------------------
5201From Benahmed Abdelkrim and Volker Dirr (on forum):
5202
5203https://lalescu.ro/liviu/fet/forum/index.php?topic=3141.0
5204
52051. Volker Dirr suggests renaming the Algeria and Morocco version to other better names, since they can be used more generally in other countries/institutions.
5206
52072. They suggest to implement some new constraints in the official FET, so that the Algeria and Morocco versions can be simulated by the official FET.
5208
5209Volker Dirr:
5210
5211I think one (maybe) needed is following constraint:
5212constraint teacher is working only in one out of two set of times.
5213
5214So if teachers should work only in the morning or in the evening, you need to add as many constraint as you have got days:
5215the first constraint:
5216    1. set of times contains all morning hours on Monday.
5217    2. set of times contains all evening hours of Monday.
5218
5219the second constraint:
5220similar with Tuesday.
5221...
5222
5223
5224This constraint can be also used to avoid the problem of an other user. I remember a guy with 3 shifts (morning, evening, night). His request was, that a teacher is not allowed to teach the night shift and then the next morning shift.
5225That could be also solved with the constraint above: "constraint teacher is working only in one out of two set of times."
5226So this time he need to setup like this:
5227the first constraint:
5228    1. set of times contains all night hours on Monday.
5229    2. set of times contains all morning hours of Tuesday.
5230
5231the second constraint:
5232...
5233
5234So again as many constraint as you have days (or days-1 if you don't work over weekend).
5235
5236---
5237
5238Volker Dirr:
5239
5240The other will be the gaps constraints.
5241So a constraint like:
5242"max gaps per day in an interval" and "max gaps per week in an interval" might be maybe enough.
5243
5244So you maybe need to add only 2 constraints:
52451. "max gaps per day in an interval" with the interval : "first hour of of morning" up to "last hour of morning"
52462. "max gaps per day in an interval" with the interval : "first hour of of evening" up to "last hour of evening"
5247
5248---
5249
5250Benahmed Abdelkrim:
5251
5252I believe it's time to rethink the 2 variants of FET with the official version.
5253This work is feasible by the addition of new time constraints for teachers and students. I myself realized this fact through adding pseudo activities to teachers and student groups. These are considered gaps. I got acceptable timetables with all student groups. But for teachers there was one or two that I have to manually edit.
5254
5255It is while working on the official version that I recently discovered this bug that accelerated the release of version 5.31.5.
5256
5257There was a lot of work to be done, especially for teachers because they did not have the same number of hours per week, and I had to think of teachers one by one.
5258
5259The time was lengthened in this way (of the hours of waiting), which I have now abandoned this project.
5260
5261Now the idea has been raised again but in another way that has encouraged me to intervene here.
5262
5263I believe it is possible to use the official version to realize time tables in the Algerian or Moroccan way.
5264For this purpose it must consider the addition of the following time constraints:
5265
52661. Min hours in a time interval
5267Interval = first hour of morning(or afternoon) - last hour of morning(or afternoon)
52682. max gaps in the last(or first) hour of morning(or afternoon) for students (set)
52693. activity(ies) ends students interval.
5270
5271---
5272
5273Benahmed Abdelkrim:
5274
5275...So it is possible -in my opinion - to integrate both versions in official FET, reasoning not by day, but by interval.
5276Can open a dialog with the user to define the number of intervals he wants.
5277
5278 for example:
5279Interval1 = first hour of morning - last hour of morning
5280interval2 = first hour of afternoon - last hour of afternoon
5281interval3 = first hour of evening - last hour of evening
5282...etc.
5283And can also define between each interval a constraint of break time.
5284
5285In this way can integrate the time constraints specific to 2 versions customized in official FET.
5286
5287315------------------DONE-----------------------------------
5288
5289316---------------------------------------------------------
5290From math (on forum):
5291
5292I'm using FET for generating the timetable for the computer science departement of a mid-sized university. In this posting I would like to suggest something that
5293I call "collection of rooms". Since I'm not a native speaker, please feel free to change this term to whatever seems to be appropriate for you.
5294
5295We have a wide variety of rooms in our university, ranging from small meeting rooms or seminar rooms up to large lecture halls for hundreds of students. But it's
5296not only the size of the rooms that is important, it's also the equippment in these rooms. A very important differentiation is the question whether a room is
5297equipped with a chalk board or a white board. While most lecturers prefer white boards, lecturers of math related courses usually prefer chalk boards.
5298
5299At the moment I'm first adding all the activities, then usually selecting all appropriate rooms in "Space->Subjects->A Subject has a set of Preferred Rooms".
5300In case of activities with the same subject but different space requirements, I even have to specify them in "Space->Activities->An Activitiy has a set of
5301Preferred Rooms" for each of these activities. My problem is exactly the following process of assigning rooms.
5302
5303When adding such a constraint in "Add subject preferred rooms", I select the subject on the top of the dialog. Below the subject there are two lists. The list
5304of all available rooms on the left and the list of selected rooms on the right. Now I have to go through the (looooooooong) list of available rooms, selecting
5305all appropriate rooms. Since I can't remember each and every room, I coded relevant information to the name of a room, e.g. "N3-106-C-SPW-50P" for "room 106
5306on third floor of building N", "managed by the Computer science department", "Seminar room equipped with Projector and Whiteboard", "capacity for 50 students".
5307So if I need a mid-sized seminar room, I have to go all through the list, selecting all matching rooms.
5308
5309First, this manual selection of rooms is quite time consuming. Second, there's a good chance of missing an appropriate room. Second is much worse since we suffer
5310a general lack of rooms, so that generating a timetable usually fails due to a lack of rooms. So it would be highly helpful if FET could support me in not missing
5311appropriate rooms.
5312
5313And I would like to suggest a way that should be easy to implement, not demanding any changes to the timetabling algorithm at all.
5314
5315I would like to be able to specify collections, e.g. "Data->Space->Collections". When adding a collection, I would like to specify a name of the collection on
5316the top of the dialog. Below this edit field there could be two list fields (just like in the constraints dialog mentioned above). In the left list there are
5317all the available room, in the right list field there are all the rooms that are part of the collection. This way I would be abe to generate a collection
5318"mid-sized seminar room" with all appropriate rooms.
5319
5320Coming back to the "Space->Subjects->A Subject has a set of Preferred Rooms" dialog. Here, in the left list there are all the available rooms. I beside this
5321list of rooms, I would like to see all collections at the top of the list. This way I could assign a collection to a subject instead of assigning room by room.
5322As a matter of fact, I could also select multiple collections or other rooms.
5323
5324When generating a timetable, these collections could be dissolved by a pre-problem, as Volker called it. A collection is just replaced with the rooms it
5325contains. If multiple collections were selected and a specific room was listed in more than one of these collections, all duplicates are removed from the list.
5326This way the algorithm gets the very same input as before, not requiring any changes here.
5327
5328I would be more than happy if you could add this collection feature to FET.
5329
5330317---------------------------------------------------------
5331From math (on forum):
5332
5333When preparing a timetable generation I specify a bunch of rooms that are appropriate for a given subject and/or activity. Based in this information FET assigns
5334one of the specified rooms at timetable generation time. However, even though I specify the rooms as appropriate, some of the given rooms are more appropriate
5335than others.
5336
5337For instance lecture halls. Some of them are brand new, some of them not. Since both kinds of lecture halls are ok for a lecture, I specify both of them as space
5338constraint. At generation time FET assigns for room types to the activities since there is no difference from FET's point of view. But when I'm looking to the
5339generated schedule and see that the lecture is assigned to an old lecture hall while a new lecture hall is available at the same time, I would like to be able to
5340manually move the activity from the old lecture hall to the new.
5341
5342I would highly appreciate if such "manual optimization" of rooms would be possible in FET. In fact, this is something that all commercial tools are able to do and
5343the feature that I miss most in FET.
5344
5345In my naive way of looking to FET I don't expect this feature to be difficult in implementation. FET knows which rooms are appropriate for an activity and it
5346knows which of these rooms are already allocated (since the timetable has just been generated). So when right-clicking on an activity in the timetable, a menu
5347option "change room to..." could appear with a sub menu holding all the available alternative rooms.
5348
5349I'd be really happy if you could integrate such functionality and I'm a bit afraid that you say something like "sorry dude, this is out of scope since FET does
5350not focus on post-generation optimization at all".
5351
5352318-------------------DONE since FET-6.0.0------------------
5353
5354319---------------------------------------------------------
5355From Vangelis Karafillidis:
5356
5357Two activities are not consecutive. For example A1 and A2 are not consecutive means that FET forces the A2 activity not to be placed immediately after A1.
5358(But A1 may be placed immediately after A2).
5359
5360Vangelis suggested that this can be solved by using a trick: It can be achieved indirectly with pseudo-activities. let's say A1 real activity,
5361P1 pseudo-activity, and A2 real activity. If you want A1 and A2 not to be consecutive, you can demand A1 and P1 to be consecutive and A2 not to overlap with P1.
5362
5363320---------------------------------------------------------
5364From Volker Dirr:
5365
5366get rid of max_days_per_week and max_hours_per_day.
5367one needed step for that is redisigning the interface, since the
5368interface use it.
5369it won't be too difficult to fix that.
5370just add hours per day and days per week as a QStringList (like teacher
5371names, subject names, ...)
5372this dialog should get buttons like in teachers, rooms, subjects, ...
5373so add a button with "up" and "down" to move the name.
5374"rename"
5375"clear all"
5376"delete"
5377"add"
5378
5379the hours per day dialog should maybe also get a button with a spinbox
5380to add X names at once.
5381Like name "1", "2", ...
5382or "1.", "2.", ...
5383or ...
5384
5385the days per week dialog should get 3 buttons like:
5386"add Monday to Friday" (so it add those 5 days. if you press that button
5387again, it should add once again. so there will be 10 days added (maybe
5388with an attached small string).
5389"add Monday to Saturday"
5390"add Monday to Sunday"
5391"add From a date To a date" So you can select 2 calender dates and it
5392just add all that dates.
5393
5394321---------------------------------------------------------
5395From Vangelis Karafillidis:
5396
5397These new views of FET (teachers/students time horizontal) for modifying an existing timetable seem to work very well. Some more suggestions mainly for facilitating
5398the modifications of an existing timetable... The code actually exists! Just to be "connected" to these windows (views).
5399Teachers view:
54001) When right-clicking on the name of a teacher (left column), a menu opens. The options are the constraints (time, room, etc) for the specific teacher. For example,
5401teacher available times, max days per week, home room etc.
54022) When right-clicking on an activity (in the timetable), a menu with two sub-menus opens. The first sub-menu has the options of modifying the specific activity.
5403The second sub-menu is actually all the of the time constraints for the specific activity (for example an activity has a preferred starting time, etc).
5404Students view:The corresponding options for the students, as mentioned above.
5405
5406I think that the above are necessary. Of course ALL the existing options for the teachers, students etc might be displayed in these menus, when right-clicking.
5407For example, modifying the data (teacher name, etc). THIS WOULD BE MUCH BETTER, SO ONE COULD MAKE MODIFICATIONS ON ALL FET FIELDS WITHOUT EXISTING THESE WINDOWS.
5408But, I don't know how complicated this part is. I have no C++ programming skills, but it seems easy.
5409The above suggested options focus on MODIFYING AN EXISTING TIMETABLE WHICH IS A COMMON PRACTICE IN REAL LIFE SITUATIONS AT SCHOOLS. I KNOW AND I ACCEPT THAT
5410MATHEMATICALLY AND COMPUTATIONALLY MODIFYING AN EXISTING TIMETABLE IT'S NOT THE BEST APPROACH.
5411
5412Liviu Lalescu:
5413
5414Your suggestions are not so easy to implement.
5415
5416322---------------------------------------------------------
5417From Vangelis Karafillidis:
5418
5419After testing the new display (mainly teachers time horizontal) for partially modifying an existing timetable, I thought of a suggestion. Most likely, it's
5420similar to "remove redundant constraints". The suggestion is to add a (percentage) multiplication factor for each one of the "groups" or time constraints.
5421This means that the user should be able to add a different multiplication factor for each one of the following groups of constraints: Teachers' time constraints
5422(for example 98%) Students' time constraints (for example 90%) Activities time constraints (for example 20%) This would affect ONLY the constraints that can have
5423weight (percentage) less than 100%. For example, teachers not available times can have ONLY 100% as a percentage. These constraints are not going to be affected.
5424But, all the other constraints (for example: teachers max gaps per day, max hours continuously) are going to be affected since they are going to be multiplied
5425by this factor. For example if there is a constraint for the TEACHER_1 such as max hours continuously = 3, weight = 100%, it is going to be now 98%.
5426If there is a constraint teacher max gaps per day = 1, weight = 98%, the new weight would become 96,04% (98%x98%). This should (more or less) relax these
5427constraints, so a temporary timetable is going to be solvable, with roughly similar (to identical) characteristics to the initial one. I don't know if the
5428above can be easily coded... It might be difficult.... But this was what I thought for facilitating the generation of a temporary timetable by slightly
5429modifying the existing one.
5430
5431Liviu Lalescu:
5432
5433I do not agree with this idea. But I added it in the TODO.
5434
5435Please note that max gaps per week/day for students/teachers constraints can only have 100% weight.
5436
5437323---------------------------------------------------------
5438From Vangelis Karafillidis:
5439
5440He suggests that all the constraints teacher not available could be presented in a teachers time horizontal manner (teacher as row, day+hour as column).
5441
5442Further suggestions:
5443
5444Generally speaking, the interaction with the GUI is crucial. Most users need easiness in entering and modifying data and of course a good monitoring of them.
5445Under this perspective, I'm suggesting the following enhancements regarding the GUI of FET, which -in no case- have any connection with drag-and-drop-like features.
5446Teacher's not available times: The teachers time horizontal view would be much more flexible
5447a) The user could monitor at once all teachers
5448b) The user could easily modify this constraint for more than one teachers at once. For example, if a group of teachers (the mathematicians) should finish their
5449lessons the latest on the 4th hour on Monday, the user could easily select these "cells" (time slots) and enter his/her data. In the same way, when all teachers
5450are not available (for example) for the last hour of Monday (this happens at the beginning of the school year at Greek schools, because many teachers are "missing",
5451and therefore schools don't "expand" their timetables until the last hour of each day), the user could easily select the entire column at once and make all teachers
5452not available for this specific hour.
5453Student's not available times:For similar reasons the time horizontal view is by far more flexible.
5454Please bear in mind that with the existing FET GUI the user needs severely more time in order to complete these tasks. Also, it's really hard for the user to monitor
5455his/her data efficiently (with the existing GUI).
5456
5457Interaction of the above "dialogues" with statistics: An example for the teachers: Let's suppose that a teacher teachers for 20 hours per week (this is the most
5458typical situation at Greek schools). The user might accidentally make this teacher available for a very small number of hours, and therefore the timetable generation
5459might become impossible. I suggest to add two columns (in this time horizontal view) right to the teachers' names. The first column should take the number of activities
5460(from the statistics) and the second column should display the number of available hour of this teacher. This (second column) should be "interactive", i.e. when the user
5461adds or removes an hour, this number should change.
5462An example for the students: The same for the students...
5463
5464Similar interactions might be useful for the space constraints, but since I've never had such constraints in my timetables, I can't judge and suggest what would work
5465better than the existing displays of FET. Most likely, the room's not available times works better in the time horizontal view, so the user will have complete control
5466on his/her data.
5467
5468For rooms not available times constraints, since a room may have weight <100%, Vangelis proposes this: By default, the cell should take the weight 100%, and if one
5469needs something different, right click and a dialogue with the new weight and instead of "X" for rooms you might display the percentage itself in red color.
5470
5471324---------------------------------------------------------
5472From Rodolfo Ribeiro Gomes (on forum):
5473
5474Add short names for teachers (and maybe students, subjects, activity tags, rooms).
5475
5476See also item #199.
5477
5478325---------------------------------------------------------
5479From Darren McDonald (on forum):
5480
5481I thought I'd make a few feature feature requests that may be useful (at least they would be useful to me!  :) ). This one is the more difficult of the two.
5482
5483I've often got a group of activities that need to have the same starting time, for example
5484
5485Mathematical Studies 1 (1+1+1)
5486Mathematical Studies 2 (1+1+1)
5487Mathematics SL 1 (1+1+1)
5488Mathematics SL 2 (1+1+1)
5489Mathematics HL (1+1+1+1)
5490
5491I can use Time>Activities>A set of activities has same starting time (day+hour), but this requires three separate entries (one for the first subactivity of
5492each subject, one for the second subactivity, and one for the third, with the final Mathematics HL subactivity left free), where each constraint involves
5493a list of 5 subactivities (which increases the possibility of error).
5494
5495Is it possible to introduce a new time constraint that would allow me to constrain, for example, the first n activities of a group of activities? Essentially,
5496I'd like to be able to specify the time constraint(s) above in a single step: providing FET with the relevant activity sets, and then specify that (in this case)
5497the first 3 subactivities should have the same start time (day+hour).
5498
5499326---------------------------------------------------------
5500From Darren McDonald (on forum):
5501
5502When creating timetables for students in the final two years of high school, I typically use student names as Groups. Within the first couple of months
5503(particularly in International Baccalaureate Diploma Programme schools), there are often a number of changes as students change subject choices.
5504
5505It would be easier to find student names (to remove them from one activity group, then add them to another) if there were a button that would allow me to sort
5506the selected groups from the Modify Activity screen (perhaps below the Clear button?).
5507
5508327---------------------------------------------------------
5509From Zsolt Udvari (on forum):
5510
5511Add a subject tag for each subject (like: "easy" or "hard") and add time constraints for these subject tags.
5512
5513328---------------------------------------------------------
5514From Valdo (on forum):
5515
5516Export the resulted timetables in time horizontal form.
5517
5518329-----------------------DONE------------------------------
5519
5520330---------------------------------------------------------
5521From Volker Dirr:
5522
5523Maybe this is a good time to restart coding csv stuff.
5524my old csv stuff was very "powerful" and "compressed", but sadly also
5525very bad "expandable"/(coded).
5526also other guys asked for exporting other time constraints. nearly
5527impossible to add that into the old code.
5528
5529so i suggest this:
5530- we keep the old csv stuff, so everyone can still use this "powerful"
5531feature. it will be also stable (never change the file format anymore).
5532- we add a new csv export (and also import). maybe call it "version 2"
5533or "beta" or "experimental" or ...
5534- the new code will NOT be able to select the order of the fields (and
5535also not be able to select headers, textquotes and field separator; even
5536i will do that maybe in the source)
5537- the first version will be similar to the current default export. so
5538just code simplification.
5539- then i will have got the chance to add new features into that code
5540(like exporting other constraints)
5541
5542331---------------------------------------------------------
5543From Zsolt Udvari (on forum):
5544
5545My days originally have had 7 hours. The school said a thing and I thought I should include a plus hour, before the original 7 hours.
5546I added it (0. hour) and I saw the hour of all time constraints updated: increased by 1.
5547I know many times it's a good feature but in my case (I've record all activities, time constraints) hasn't increase. My 0. hour is like a virtual hour.
5548
5549Now I can manually rewrite the .fet file but I think it would be nice when user can disable this feature - maybe FET ask about it the user when add later
5550(means there are time constraints) a new hour.
5551
5552332---------------------------------------------------------
5553From Zsolt Udvari (on forum):
5554
5555Maybe a user error (PEBKAC) but I think I share it.
5556
5557So I've a little complicated FET-file and it seems the "An activity has a preferred starting time" doesn't work.
5558
5559I attached the file and try to generate and check:
5560
5561    Nr. 895 and 896 activities (without any teacher and student)
5562    They have preferred starting time: "Szerda 1." (Wednesday) and "Hétfő 3." (Monday) with 100%
5563    They have same starting time (day+hour) with 7 other activites (for example 647 and 648)
5564    Generate (without success)
5565    Check the student's timetable, go to "11A" and the 647 is on "Péntek" (Friday)!
5566
5567333---------------------------------------------------------
5568From Valdo (on forum):
5569
5570A new addition to Spreading activities uniformly in the week for activities split in to 2 components:
5571
5572Constraints max days between activities (2 components) with the possibility to select max days and weight.
5573
5574334---------------------------------------------------------
5575From Zsolt Udvari (on forum):
5576
5577I try to find the impossible constraint(s) in my FET-file and I think it's uncomfortable that only on "Time/All" dialog can activate/deactivate the constraints.
5578I think it would be nice when can activate/deactivate for example on "An activity has a preferred starting time" dialog (and on the others too).
5579
5580335---------------------------------------------------------
5581From Volker Dirr:
5582
5583There are not many variables to mutex in the generation.cpp. So it will
5584be faster to use std::atomic or QAtomic command instead of using mutex.
5585(The atomic commands will do a mutex if the cpu doesn't support atomic
5586operations. so cpus without atomic support won't generate faster, but
5587other cpus will.)
5588
5589336---------------------------------------------------------
5590From Benahmed Abdelkrim (on forum):
5591
5592Constraint min working hours in an interval.
5593
5594This constraint is very useful in many situations such as, for example, not bringing a teacher (or all teachers) for a single hour in a given interval.
5595
5596337---------------------------------------------------------
5597From Fernando A F Lordão (on forum):
5598
5599After testing the new feature (showing the number of assigned hours for teachers and students in the HTML statistics of the timetables) I figured out about
5600another situation that occurs in my institution.
5601Here we have a rule that recommends coordinators not to assign more than three different subjects to one teacher. Sometimes it occurs, but it's not the ideal scenario.
5602So, I thought about including two more columns in the statistics file:
5603* "Total of Activities"
5604* "Different Subjects" (counting different string description of the subjects assigned to the teacher)
5605
5606338---------------------------------------------------------
5607From mercurialuser (on forum):
5608
5609I'd like to have fet-cl write the highest timetable without stopping the program. I'm getting 63x out of 639 activity placed and so I'd like to see what it is
5610happening, which activity is blocked by which constraint, etc etc..
5611
5612It would be nice to be able to load the saved partial timetable and restart the search from that point... of course, I'd modify the constraints to be able to
5613place the remaining activities...
5614
5615Liviu Lalescu:
5616
5617For part 1) It is difficult, because I cannot rely on more signals. I already use SIGTERM.
5618
5619But I think you can safely interrupt the generation with SIGTERM and get the highest stage timetable. It would not be useful to continue the generation.
5620If you change a constraints, the whole procedure changes (see your second request and my answer, below). You can see the initial activities order in the
5621logs, and the maximum placed activities. The next one after the maximum placed is problematic.
5622
5623For part 2) This would not be possible. If you modify the constraints, the whole thing is changed.
5624
5625339---------------------------------------------------------
5626From Roberto Bergonzini:
5627
5628Manual timetabling - drag and drop.
5629
5630Just make a timetable view teachers, keeping only the free days and the not available constraints for the teachers.
5631
5632Also suggested by mercurialuser.
5633
5634Forum link: https://lalescu.ro/liviu/fet/forum/index.php?topic=3461.0
5635
5636340---------------------------------------------------------
5637From Emiliano Llano Díaz:
5638
5639Improvement suggestion: Is a nag that each time you open FET it does not "remember" the file it was working on (I know it is just 2 clicks away on
5640file->open recent, but... you know humans are lazy ��  )
5641
5642341---------------------------------------------------------
5643From mohammed (on forum):
5644
5645Nous voulons ajouter la fonction de sauvegarde automatique du programme, en cas de travail, l'alimentation s'éteint
5646
5647(We would like to add the function of automatic save of the program, in case of work, the power goes off).
5648
5649342---------------------------------------------------------
5650From Vangelis Karafillidis:
5651
5652All students must respect the maximum number of span (in hours) per day -> better write:
5653
5654All students must respect the maximum span (in number of hours) per day.
5655
5656Circular -> better write: Circularly.
5657
5658343---------------------------------------------------------
5659From Rodolfo Ribeiro Gomes:
5660
5661What do you think about leaving the version number and date out of
5662HelpAboutForm_template.ui ?
5663Maybe leaving a placeholder there, and making use of FET_VERSION and a
5664l10n version of date.
5665
5666That will reduce .ts diff a lot and reduces translator efforts ;)
5667
5668344---------------------------------------------------------
5669From V Paul C Charlesraj (on forum):
5670
5671Minimum number of days in a week for all students.
5672
5673Liviu:
5674
5675Or for a students set. This is very difficult to implement perfectly (to take care of combinations with the other constraints).
5676
5677345---------------------------------------------------------
5678From Rodolfo Ribeiro Gomes:
5679
5680(referring to translation of plural forms)
5681
5682I also saw this in daysform.cpp :
5683
5684        if(cnt_rem>0){
5685            s+=tr("%1 constraints will be removed.", "%1 is the number
5686of constraints").arg(cnt_rem);
5687            s+=" ";
5688        }
5689        if(cnt_mod>0){
5690            s+=tr("%1 constraints will be modified.", "%1 is the
5691number of constraints").arg(cnt_mod);
5692            s+=" ";
5693        }
5694        s+=tr("Do you want to continue?");
5695
5696Maybe this part could use %n too?
5697
5698Liviu Lalescu:
5699
5700Yes, it should, also in hoursform.cpp and also in
5701alltime/spaceconstraintsform.cpp.
5702
5703But I think there are plenty of places to modify and it is really too
5704much. But I'll think of it.
5705
5706Problem: see for instance alltimeconstraintsform.cpp:
5707
5708	constraintsTextLabel->setText(tr("%1 / %2 time constraints",
5709	 "%1 represents the number of visible active time constraints, %2 represents the total number of visible time constraints")
5710	 .arg(n_active).arg(visibleTimeConstraintsList.count()));
5711
5712Which is %n? %1 or %2?
5713
5714Also advancedlockunlockform.cpp:
5715
5716	QMessageBox::information(&lastConfirmationDialog, tr("FET information"), tr("There were removed %1 locking time constraints and"
5717		" %2 locking space constraints. There were not removed %3 locking time constraints and %4 locking space constraints, because"
5718		" these activities were permanently locked").arg(removedTime).arg(removedSpace).arg(notRemovedTime).arg(notRemovedSpace));
5719
5720It is very difficult.
5721
5722I am sorry, but the code is full of such mistakes. It is too late now
5723to correct.
5724
5725Rodolfo Ribeiro Gomes:
5726
5727Difficult indeed.
5728
5729The only way out I can see would be replace:
5730
5731"There were removed %1 locking time constraints and %2 locking space
5732constraints. There were not removed %3 locking time constraints and %4
5733locking space constraints, because these activities were permanently
5734locked"
5735
5736by:
5737
5738"There were removed %1 and %2. There were not removed %3 and %4,
5739because these activities were permanently locked"
5740where %1 would be "%n locking time constraint(s)", etc.
5741
5742346---------------------------------------------------------
5743From Taro Tada:
5744
5745Either allow two or more users to work concurrently on a unique FET file, or allow the merging of two or more .fet files.
5746
5747347---------------------------------------------------------
5748From bachiri401 (on forum):
5749
5750For all students sets subject Sport cannot be followed immediately by a hard subject like Math.
5751
5752Liviu and Rodolfo Ribeiro Gomes:
5753
5754Constraint two activities not consecutive (to say that the situation A1, then immediately A2 is forbidden, any
5755other situation is acceptable).
5756
5757348---------------------------------------------------------
5758From Fernando A F Lordão (on forum):
5759
5760I would suggest the use of the current filter values as default values when the user presses the "Add" button for constraints.
5761
5762For instance, I noticed the importance of this when I was inserting teachers time constraints (SCREEN "Constraints teacher not available times"). Let me explain...
5763
5764As I had many constraints already set inherited from the previous semester, I was firstly filtering by name and modifying the preferences previously saved.
5765At this moment, when I was filtering by a given name and that name had NO constraints yet, I was forced to "Add" a new constraint to that teacher and several
5766times I included the constraint with the first name on the list, having so to step back and remove the wrong constraint.
5767
5768I think this mistake happens because our brain thinks: "I have already chosen the name", but it does NOT take into account that it was on the previous screen.
5769So, how about we give a hand to the brain and inherit the values from filters to the next "Add" screen.
5770
5771349---------------------------------------------------------
5772From Benahmed Abdelkrim (on forum):
5773
5774He complains that if a constraint min days between activities has consecutive if same day unselected, there can be 3 activities on the same day
5775(or real day, for the custom Morocco and Algeria versions).
5776
5777Volker Dirr suggests to add a Boolean setting for the min days between activities constraints, so that only 2 activities are allowed on the same day
5778if this value is true.
5779
5780350---------------------------------------------------------
5781From aisse (on forum):
5782
5783I think the program can be improved better if the restrictions are in the form of buttons .. For example, the Algerian version of the middle schools we
5784need some restrictions only .. I think the format of the program in its Algerian version will be better and easier by buttons pre-programmed .. Where all
5785buttons are in one interface as long Their number will be small in the Algerian version
5786
5787For example, we say the Algerian version.. but in reality there are many types of schools and every type what needs. There are middle schools, secondary
5788schools, primary schools, private schools ..and institutes of very different types. The constraints in the Algerian version are general to all. But when we
5789come to the privacy of each school, each one needs constraints and it does not need another .. I work in a middle school, I only need some constraints which
5790can all be put in one interface ..
5791
5792Liviu Lalescu: So you need a customisable interface (where you can add/remove buttons from the interface)?
5793
5794aisse: Not exactly .. I suggested reducing the version .. to become " FET for Algerian middle schools...The buttons are fixed.
5795
5796351---------------------------------------------------------
5797From Benahmed Abdelkrim (on forum):
5798
5799in the list of conflicts why not specify the names of hours with the days
5800ex: ... activity (A1) is in conflict with activity (A2) in Tuesday (2) and Tuesday (4) ...
5801
5802the numbers (2) and (4) are the names given by the user at the hours.
5803
5804one of the advantages of this suggestion is to know if the activities are consecutive or not.
5805
5806Volker Dirr: You also need to see the duration, because you can only know then if they are
5807consecutive or not.
5808
5809352---------------------------------------------------------
5810From Volker Dirr (on forum):
5811
5812There are constraints like max hours daily or interval max days per week which allow their data to be redundant (they allow n_hours_per_day or
5813n_days_per_week), and other constraints, like min days between activities, which don't allow their data to be redundant (they allow only
5814n_days_per_week-1).
5815
5816Volker suggests to allow only non-redundant data (like min days between activities constraints).
5817
5818353---------------------------------------------------------
5819From Volker Dirr:
5820
5821add a warning before generating (generate_pre.cpp):
5822check min days between activities constraints:
5823if ((number_of_activities.count() > 2*days_per_week) &&
5824forceConsecutive.isEnabled()) => IMPOSSIBLE
5825
5826354---------------------------------------------------------
5827From Volker Dirr:
5828
5829If there are activities in a constraint activities same starting
5830time and an activity is forbidden a time slot, then all the others are
5831also forbidden this time slot.
5832
5833Liviu: It might not be critical, as activities with same starting time constraints are placed one near the other in the initial order
5834(problems might arise only if the user uses the advanced option "Group activities in the initial order").
5835
5836355---------------------------------------------------------
5837From Volker Dirr:
5838
5839If an activity A has preferred room R and R is not available
5840on some time slots, make A not available on these time slots.
5841
5842(See also item #356.)
5843
5844356---------------------------------------------------------
5845From Volker Dirr:
5846
5847Take care of this potential problem: If an activity
5848A with duration >=2 has preferred two rooms, and in
5849the first hour R1 is available but R2 not, then in the second hour R2 is
5850available but R1 not, A is impossible to place.
5851
5852(See also item #355.)
5853
5854357---------------------------------------------------------
5855From Volker Dirr:
5856
5857The order of the activities are not always good. activities with a
5858very low number of available slots might be much too late in the order.
5859(for example pseudo activities "lunch".)
5860
5861358---------------------------------------------------------
5862From Volker Dirr:
5863
5864Care about not available times if activities are consecutive.
5865
5866Volker: the code might look like the attached (be careful: not tested much
5867yet; so it might contain still bugs)
5868//NEW Variant (start)
5869	foundImprovement=0;	//TODO:delete
5870	bool addImprovement=true;
5871	//care about consecutive by Volker Dirr
5872	//TODO: same starting time and consecutive might effect each other. so
5873repeat both as long as something changed?!
5874	//DO THIS AS LAST
5875	while(addImprovement){
5876		addImprovement=false;
5877		for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){
5878			if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_2_ACTIVITIES_CONSECUTIVE){
5879				Constraint2ActivitiesConsecutive*
5880c2=(Constraint2ActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i];
5881				if(gt.rules.internalTimeConstraintsList[i]->weightPercentage==100.0){
5882					//if firstActivity or secondActivity has a same starting time, then
5883it must be recheeckt?!
5884					int firstActivity=c2->firstActivityIndex;
5885					int secondActivity=c2->secondActivityIndex;
5886					for(int d=0; d<gt.rules.nDaysPerWeek; d++){
5887						//get times
5888						int firstPeriodOfFirstActivity=-1;
5889						int lastPeriodOfFirstActivity=gt.rules.nHoursPerDay-1;
5890						int firstPeriodOfSecondActivity=-1;
5891						int lastPeriodOfSecondActivity=gt.rules.nHoursPerDay-1;
5892						for(int h=0; h<gt.rules.nHoursPerDay; h++){
5893							int currentTime=d+h*gt.rules.nDaysPerWeek;
5894							if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
5895								if(firstPeriodOfFirstActivity==-1)
5896									firstPeriodOfFirstActivity=h;
5897								lastPeriodOfFirstActivity=h;
5898							}
5899							if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
5900								if(firstPeriodOfSecondActivity==-1)
5901									firstPeriodOfSecondActivity=h;
5902								lastPeriodOfSecondActivity=h;
5903							}
5904						}
5905						assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
5906						assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
5907						assert(lastPeriodOfFirstActivity>=firstPeriodOfFirstActivity);
5908						assert(lastPeriodOfSecondActivity>=firstPeriodOfSecondActivity);
5909
5910						int durationFirstActivity =
5911gt.rules.internalActivitiesList[firstActivity].duration;
5912
5913						if((firstPeriodOfFirstActivity>=0) &&
5914(firstPeriodOfSecondActivity>=0)){
5915							if(lastPeriodOfFirstActivity==lastPeriodOfSecondActivity){
5916								lastPeriodOfFirstActivity--;
5917							} else
5918								if(lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
5919									lastPeriodOfFirstActivity=lastPeriodOfSecondActivity-1;
5920								}
5921							else {
5922								int numberOfFollowingBreaks=0;
5923								for(int i=lastPeriodOfFirstActivity+1;
5924i<=lastPeriodOfSecondActivity; i++){
5925									if(!breakDayHour[d][i]){
5926										break;
5927									}
5928									numberOfFollowingBreaks++;
5929								}
5930								if(firstPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks>lastPeriodOfSecondActivity){
5931									firstPeriodOfFirstActivity=-1;
5932									firstPeriodOfSecondActivity=-1;
5933								} else {
5934									if(lastPeriodOfSecondActivity>lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks){
5935										lastPeriodOfSecondActivity=lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks;
5936										assert(!breakDayHour[d][lastPeriodOfSecondActivity]);
5937									}
5938								}
5939							}
5940
5941							/*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
5942							|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
5943							|| firstPeriodOfFirstActivity>firstPeriodOfSecondActivity
5944							|| lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
5945							QMessageBox::warning(nullptr, QObject::tr("FET warning"),
5946QObject::tr("F1=%1   L1=%2   F2=%3
5947L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity));
5948							}*/
5949
5950							assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
5951							assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
5952							//assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity);
5953// not correct that this position, correction is following now
5954							assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
5955
5956							if((firstPeriodOfFirstActivity>=0) &&
5957(firstPeriodOfSecondActivity>=0)){
5958								if(firstPeriodOfFirstActivity==firstPeriodOfSecondActivity){
5959									firstPeriodOfSecondActivity+=durationFirstActivity;
5960									assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
5961								} else
5962									if(firstPeriodOfFirstActivity>firstPeriodOfSecondActivity){
5963										firstPeriodOfSecondActivity=firstPeriodOfFirstActivity+durationFirstActivity;
5964										assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
5965									}
5966								else {
5967									int numberOfFollowingBreaks=0;
5968									for(int i=firstPeriodOfSecondActivity-1;
5969i>=firstPeriodOfFirstActivity; i--){
5970										if(!breakDayHour[d][i]){
5971											break;
5972										}
5973										numberOfFollowingBreaks++;
5974									}
5975									assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
5976									if(lastPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks<firstPeriodOfFirstActivity){
5977										firstPeriodOfFirstActivity=-1;
5978										firstPeriodOfSecondActivity=-1;
5979									} else {
5980										if(firstPeriodOfFirstActivity<firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks){
5981											firstPeriodOfFirstActivity=firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks;
5982											assert(!breakDayHour[d][firstPeriodOfFirstActivity]);
5983										}
5984									}
5985								}
5986							}
5987							assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
5988							assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
5989							assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity);
5990							assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
5991							if(	lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
5992								|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
5993								|| firstPeriodOfFirstActivity>=lastPeriodOfSecondActivity
5994								||
5995firstPeriodOfFirstActivity+durationFirstActivity>lastPeriodOfSecondActivity
5996								||
5997lastPeriodOfSecondActivity-durationFirstActivity<firstPeriodOfFirstActivity){
5998									firstPeriodOfFirstActivity=-1;
5999									firstPeriodOfSecondActivity=-1;
6000							}
6001						}
6002
6003						/*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
6004						|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
6005						|| firstPeriodOfFirstActivity>firstPeriodOfSecondActivity
6006						|| lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
6007						QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6008QObject::tr("F1=%1   L1=%2   F2=%3
6009L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity));
6010						}*/
6011
6012//lastPeriodOfFirstActivity>firstPeriodOfSecondActivity
6013
6014						if((firstPeriodOfFirstActivity<0) ||
6015(firstPeriodOfSecondActivity<0)){
6016							for(int h=0; h<gt.rules.nHoursPerDay; h++){
6017								int currentTime=d+h*gt.rules.nDaysPerWeek;
6018								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
6019									notAllowedTimesPercentages[firstActivity][currentTime]=100;
6020									addImprovement=true;
6021									foundImprovement++;	//TODO delete this
6022								}
6023								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
6024									notAllowedTimesPercentages[secondActivity][currentTime]=100;
6025									addImprovement=true;
6026									foundImprovement++;	//TODO delete this
6027								}
6028							}
6029							continue;
6030						}
6031
6032						//TODO: only if this happen each day!!!
6033						/*if(lastPeriodOfFirstActivity + durationFirstActivity <
6034firstPeriodOfSecondActivity){
6035							QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6036QObject::tr("Activity %1 and Activity %2 can't be
6037consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id));
6038						}
6039
6040
6041						if(firstPeriodOfSecondActivity - durationFirstActivity < 0){
6042							QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6043QObject::tr("*Activity %1 and Activity %2 can't be
6044consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id));
6045							QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6046QObject::tr("%1 - %2 <
60470").arg(firstPossiblePeriodForSecondActivity).arg(durationFirstActivity));
6048						}*/
6049
6050						//lock times of first activity
6051						for(int h=0; h<gt.rules.nHoursPerDay; h++){
6052							int currentTime=d+h*gt.rules.nDaysPerWeek;
6053							if(h<firstPeriodOfFirstActivity){
6054								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
6055									notAllowedTimesPercentages[firstActivity][currentTime]=100;
6056									addImprovement=true;
6057									foundImprovement++;	//TODO delete this
6058									//QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6059QObject::tr("* Lock day %1 and hour %2 of activity
6060%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id));
6061								}
6062							} else if(h>lastPeriodOfFirstActivity){
6063								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
6064									notAllowedTimesPercentages[firstActivity][currentTime]=100;
6065									addImprovement=true;
6066									foundImprovement++;	//TODO delete this
6067									//QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6068QObject::tr("* Lock day %1 and hour %2 of activity
6069%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id));
6070								}
6071							} else
6072								if(notAllowedTimesPercentages[firstActivity][currentTime]==100
6073&& !breakDayHour[d][h]){
6074									if(h+1<gt.rules.nHoursPerDay){
6075										if(notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]!=100){
6076											notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]=100;
6077											addImprovement=true;
6078											foundImprovement++;	//TODO delete this
6079											//QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6080QObject::tr("*second* Lock day %1 and hour %2 of activity
6081%3.").arg(d).arg(h-durationFirstActivity).arg(gt.rules.internalActivitiesList[firstActivity].id));
6082										}
6083									}
6084								}
6085						}
6086
6087						//lock times of second activity
6088						for(int h=0; h<gt.rules.nHoursPerDay; h++){
6089							int currentTime=d+h*gt.rules.nDaysPerWeek;
6090							if(h<firstPeriodOfSecondActivity){
6091								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100
6092&& !breakDayHour[d][h-1]){
6093									notAllowedTimesPercentages[secondActivity][currentTime]=100;
6094									//QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6095QObject::tr("** Lock day %1 and hour %2 of activity
6096%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id));
6097									addImprovement=true;
6098									foundImprovement++;	//TODO delete this
6099								}
6100							} else if(h>lastPeriodOfSecondActivity){
6101								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
6102									notAllowedTimesPercentages[secondActivity][currentTime]=100;
6103									//QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6104QObject::tr("*** Lock day %1 and hour %2 of activity
6105%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id));
6106									addImprovement=true;
6107									foundImprovement++;	//TODO delete this
6108								}
6109							} else
6110								if(notAllowedTimesPercentages[secondActivity][currentTime]==100
6111&& !breakDayHour[d][h]){
6112									if(h-durationFirstActivity>=0){
6113										if(notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]!=100){
6114											notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]=100;
6115											addImprovement=true;
6116											foundImprovement++;	//TODO delete this
6117											//QMessageBox::warning(nullptr, QObject::tr("FET warning"),
6118QObject::tr("*first* Lock day %1 and hour %2 of activity
6119%3.").arg(d).arg(h+durationFirstActivity).arg(gt.rules.internalActivitiesList[secondActivity].id));
6120										}
6121									}
6122								}
6123						}
6124					}
6125				}
6126			}
6127		}
6128	}
6129	//end Volker
6130
6131359---------------------------------------------------------
6132From Volker Dirr:
6133
6134Care about not available times if activities are grouped (2 or 3).
6135
6136360---------------------------------------------------------
6137From Volker Dirr:
6138
6139Care about not available times if students early, no gaps and max hours per day.
6140
6141361---------------------------------------------------------
6142From Volker Dirr:
6143
6144The following code should be nearly perfect for CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY and CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR.
6145(For example 2 activities with CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY.
6146A1 only available at one day in the first hour and A2 is also available
6147at the same day also not the same hour and A1 is conflicting with A2,
6148then my code won't see that it is possible to disallow that hour also.
6149
6150but I think that these are very very unlikely and special cases. I don't know
6151if something like that is in a real dataset and if it is useful to
6152search for such improvements, since those are more critical to detect.
6153This can be also improved if you care about duration.)
6154
6155The code also includes simplified speedups for CONSTRAINT_TWO_ACTIVITIES_GROUPED, CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE and CONSTRAINT_THREE_ACTIVITIES_GROUPED.
6156These constraints can still be improved.
6157
6158Before computeFixedActivities in generate_pre it is useful to disallow days and hours that can't be available:
6159
6160QList<QSet<int>> activitiesListWithDayNotAvailableSet;
6161QList<QSet<int>> activitiesListWithHourNotAvailableSet;
6162for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
6163	QSet<int> dayNotAvailable;
6164	activitiesListWithDayNotAvailableSet<<dayNotAvailable;
6165}
6166for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
6167	QSet<int> hourNotAvailable;
6168	activitiesListWithHourNotAvailableSet<<hourNotAvailable;
6169}
6170bool notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
6171
6172while(notAvailableFound){
6173	setNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
6174	notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
6175}
6176
6177
6178bool computeDayOrHourNotAvailable(QList<QSet<int>> *activitiesListWithDayNotAvailableSet, QList<QSet<int>> *activitiesListWithHourNotAvailableSet){
6179	bool newImprovementFound=false;
6180	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
6181		for(int d=0; d<gt.rules.nDaysPerWeek; d++){
6182			bool wholeDayNotAvailable=true;
6183			for(int h=0; h<gt.rules.nHoursPerDay; h++){
6184				if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){
6185					wholeDayNotAvailable=false;
6186					break;
6187				}
6188			}
6189			if(wholeDayNotAvailable){
6190				if(!(*activitiesListWithDayNotAvailableSet).at(ai).contains(d)){
6191					(*activitiesListWithDayNotAvailableSet)[ai]<<d;
6192					newImprovementFound=true;
6193				}
6194			}
6195		}
6196	}
6197	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
6198		for(int h=0; h<gt.rules.nHoursPerDay; h++){
6199			bool wholeHourNotAvailable=true;
6200			for(int d=0; d<gt.rules.nDaysPerWeek; d++){
6201				if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){
6202					wholeHourNotAvailable=false;
6203					break;
6204				}
6205			}
6206			if(wholeHourNotAvailable){
6207				if(!(*activitiesListWithHourNotAvailableSet).at(ai).contains(h)){
6208					(*activitiesListWithHourNotAvailableSet)[ai]<<h;
6209					newImprovementFound=true;
6210				}
6211			}
6212		}
6213	}
6214	return newImprovementFound;
6215
6216}
6217
6218void setNotAvailable(QList<QSet<int>> *activitiesListWithDayNotAvailableSet, QList<QSet<int>> *activitiesListWithHourNotAvailableSet){
6219	for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){
6220		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY){
6221			ConstraintActivitiesSameStartingDay* sst=(ConstraintActivitiesSameStartingDay*)gt.rules.internalTimeConstraintsList[i];
6222			if(sst->weightPercentage==100){
6223				for(int j=0; j<sst->_n_activities; j++){
6224					foreach(int d, (*activitiesListWithDayNotAvailableSet).at(j)){
6225						for(int ai=0; ai<sst->_n_activities; ai++){
6226							for(int h=0; h<gt.rules.nHoursPerDay; h++){
6227								notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100;
6228							}
6229						}
6230					}
6231				}
6232			}
6233		}
6234		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_GROUPED){
6235			ConstraintTwoActivitiesGrouped* c2=(ConstraintTwoActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i];
6236			if(c2->weightPercentage==100){
6237				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
6238					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6239						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6240					}
6241				}
6242				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
6243					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6244						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6245					}
6246				}
6247			}
6248		}
6249		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE){
6250			ConstraintTwoActivitiesConsecutive* c2=(ConstraintTwoActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i];
6251			if(c2->weightPercentage==100){
6252				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
6253					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6254						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6255					}
6256				}
6257				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
6258					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6259						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6260					}
6261				}
6262			}
6263		}
6264		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_THREE_ACTIVITIES_GROUPED){
6265			ConstraintThreeActivitiesGrouped* c2=(ConstraintThreeActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i];
6266			if(c2->weightPercentage==100){
6267				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
6268					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6269						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6270						notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6271					}
6272				}
6273				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
6274					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6275						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6276						notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6277					}
6278				}
6279				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->thirdActivityIndex)){
6280					for(int h=0; h<gt.rules.nHoursPerDay; h++){
6281						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6282						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
6283					}
6284				}
6285			}
6286		}
6287		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR){
6288			ConstraintActivitiesSameStartingHour* sst=(ConstraintActivitiesSameStartingHour*)gt.rules.internalTimeConstraintsList[i];
6289			if(sst->weightPercentage==100){
6290				for(int j=0; j<sst->_n_activities; j++){
6291					foreach(int h, (*activitiesListWithHourNotAvailableSet).at(j)){
6292						for(int ai=0; ai<sst->_n_activities; ai++){
6293							for(int d=0; d<gt.rules.nDaysPerWeek; d++){
6294								notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100;
6295							}
6296						}
6297					}
6298				}
6299			}
6300		}
6301	}
6302}
6303
6304362--------------------------------------------------------
6305From math (on forum):
6306
6307When I start preparing a new timetable for the next semester, I do not start from scratch but from some kind of base configuration file. This file
6308contains general information about rooms, times of blocks, teachers, lecture titles, etc. So I can directly start with creating activities etc.
6309
6310The list of teachers is quite long and encompasses both internal and external teachers. Internal teachers have a full contract with our university
6311while external teachers are external experts that are hired only for one specific lecture, project or seminar in that particular semester.
6312If somebody new is giving a lecture for the first time, I add him or her to this base configuration file, no matter if he/she will ever give a course
6313in one of the following semesters. Hence, only a small subset of configured teachers is actually teaching within that semester. When printing timetables
6314for teachers, I either have to create lots of empty timetables or I have to carefully select all the "active" teachers from the list. To be honest,
6315I usually take the easier way.
6316
6317So here's my suggestion: wouldn't it be possible to add another option to the settings dialog? (e.g. Settings -> Timetables -> Hide teachers without activities)
6318When this option is disabled (standard behaviour), FET acts like it currently does.
6319When this option is enabled, the list of teachers in the timetabling dialogs (Timetable -> Teachers -> ...) is filtered, so that it only contains teachers
6320that actually have activities in their timetables. Also the teacher list in the printing dialog (Timetable -> Print -> Teachers) is filtered in this way.
6321
6322---
6323
6324Additional suggestion from math on this subject:
6325
6326When selecting "Timetable -> Print" a dialog opens that has a dropdown list with potential printing types (e.g. rooms, teachers, subjects, ...). When selecting an
6327item from that dropdown list, the listbox on the left hand side is filled with all items of that type, e.g. all rooms. Below that listbox there are two buttons "All"
6328and "None". By pressing these buttons I can select/deselect all items of that list.
6329
6330I thought of adding a third button (e.g. "used") here. When pressing that button only those items are selected that are actually used in the recently generated
6331timetable. For example:
6332- if pressing the "used" button in "teacher" mode, only the teachers from the list are selected that have at least one activity planned (i.e. omitting all teachers
6333with empty timetables)
6334- if pressing the "used" button in "room" mode, only rooms from the list are selected that are used for at least one activity
6335- if pressing the "used" button in "subgroup" mode, only student subgroups are selected where at least one activity is assigned (i.e. omitting all subgroups without
6336activities, e.g. due to internship semesters)
6337
6338363---------------------------------------------------------
6339From pg788 (on forum):
6340
6341I understand this might be restrictive, but a teacher doesn't want to begin in 3rd or 4th, since there is traffic.
6342
6343364---------------------------------------------------------
6344From Dietmar Deuster and Volker Dirr:
6345
6346Constraints:
6347- activity must start a students day
6348- activity must start or end a students day
6349
6350Liviu: start may be possible, but start or end seems very difficult, maybe impossible. Please see also item #295, point 2.
6351
6352365---------------------------------------------------------
6353From Volker Dirr and Liviu Lalescu:
6354
6355Volker has a private file which sometimes is solvable, but sometimes may cycle. We tried to improve the code, but it runs much slower on other files.
6356
6357366---------------DONE since FET-5.40.1 2019-11-14----------
6358
6359367---------------------------------------------------------
6360From Anthony Siaudeau:
6361
6362Is there a possibility to have tags to constraints (for example to activate/inactivate a group of constraints with one click) ?
6363
6364Is there a possibility to activate/inactivate activities with one click in the activities windows ?
6365
6366Volker Dirr:
6367
6368I fear a bit that adding such a constraint into official version might mislead several FET users to do hasty action. So I guess such a feature will make
6369it only much more complicated to users with low skills since they won't understand their bugs anymore if the enable/disable several constraint at once.
6370
6371Anthony Siaudeau:
6372
6373I understand the risks for soft users. Is it possible to add in advanced settings an unlock button for active check boxes ?
6374
6375368---------------------------------------------------------
6376(see also items #58, #149, and #396)
6377From Anthony Siaudeau:
6378
6379I know an undo button isn't possible but is it possible to have a change
6380history ?
6381When I work hard to optimize a timetable the generation time could be
6382high. And few times, when I break the generation or when the generation
6383is succesfull, I forget my last modification. With a change history it
6384could be easier.
6385Maybe such history needs discusssion about the level of details
6386integrated for each actions. For example said "activity n° 1234 had been
6387changed" had a lack of information while "teacher alpha had available
6388time changed monday hour1, monday hour 2, .... friday hour 7" will
6389probably be too much detail.
6390
6391369---------------------------------------------------------
6392From George Milliotis (Corfiot) - on forum:
6393
6394I would like to be able to group activities (maybe via tags) and be able to save html only for one or more of those groups.
6395
6396I generate schedules for undergrads, postgrads and some special course sets and I have to generate them together so the rooms/teachers work out.
6397Then I need to copy FET output to separate tables manually to distribute. I would like to have the ability to just output different schedules.
6398
6399It would possibly be easier to be able to export a new FET file with only the rules and activities relevant to this group/tag. I could then
6400generate schedule html from those files. Although that would require some extra steps.
6401
6402370---------------------------------------------------------
6403From George Milliotis (Corfiot) - on forum:
6404
6405I would like to have activities that do not count towards time or space rules. I have breaks that have to be within a specific time range so that
6406students can eat while the restaurant is open.
6407
6408If I put an activity for that FET finds places for me, which is a great help but then rules like students max hours continuously trigger and my
6409schedule breaks.
6410
6411What I'm after are "soft" breaks.
6412
6413371---------------------------------------------------------
6414From George Milliotis (Corfiot) - on forum:
6415
6416I make schedules and then save them locked in a new FET file. This leaves the general constraints in the file alongside the newly added specific
6417locking rules. If I later make a change to the placement of an activity (time or space) FET only says that it can't be placed.
6418
6419I would like FET to list me all the rules conflicting with the two locked time/space rules for the activity so I can pinpoint which "general"
6420constraint is the problem. This would save me A LOT of time.
6421
6422Eg:
6423Activity #111: Blah blah, teacher blah, students blah
6424  TIME LOCK (day X - time Y) PLACEMENT  FAILED BECAUSE:
6425      this rule
6426      that rule
6427  SPACE LOCK (room Z) PLACEMENT FAILED BECAUSE:
6428     this rule
6429     that rule
6430
6431For example, it should be obvious that a rule max students hours daily that blocks a set of locked activities on the same day for that student set
6432is easily detectable as the culprit.
6433
6434Or, a max teachers gaps per week rule when all other relevant activities to a teacher are placed, would also be easy to identify if we're placing
6435a time-locked activity.
6436
6437372---------------------------------------------------------
6438From satellite2 - on forum:
6439
6440FET has the option for selecting buildings of the rooms and assigning very useful constraints for the teachers/students such as min gaps
6441between building changes and max building changes per day/week. Our university has 3 different campuses in the city and they are really
6442far away from each other. Sometimes teachers and students need to visit more than one campus a week for different courses. So with the
6443current options, I am considering to use each campus name as a building and assign the max building changes per day to ZERO since it is
6444not that easy for teachers/students to change their campus in a day. However, this time I will not be able to use the actual building names
6445inside each campus. I will not be able to assign min gaps between building changes since building names are used for the campus names. Actual
6446buildings are also needed since some of the buildings also have some distance between them on foot and at least 1 period gap is needed.
6447
6448What I want to ask is that is it difficult to add an additional hierarchical level above building variable to the current code and call it
6449"campus" or something else? Also similar space constraint for the campus variable such as max campus changes a day?
6450
6451Liviu and satellite2: maybe add each building in its own campus.
6452
6453373---------------------------------------------------------
6454From Jude G:
6455
6456  *   Importing comments to activities / students / teachers.
6457  *   Option for having full names and codes.
6458(so teachers, students, ..., will have two names: a long name and a short name).
6459
6460374---------------------------------------------------------
6461From bharatstank (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3989.0)
6462
6463Room not available constraint - wherein (X) crossing the specific slot means No activity is placed in that (X) slot.
6464
6465Please suggest - if there is any option, wherein I can Define multiple type of Room not available constraints, so that Instead of (X) slot - we have better meaningful
6466Message to display.
6467
6468There are few Activities, which are not time tabled and are communicated back to the concern department by simply (X) the Class rooms slot.
6469
6470375---------------------------------------------------------
6471From satellite2 (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0)
6472
6473The other constraint is "max hours per day for a teacher (or all teachers)". Is there a way to add another constraint like "max activities per day for a
6474teacher (or all teachers)" ? The hours of the activities change from 1 to 4 but teachers see them as an activity and let's say some of them don't want more
6475than two activities a day etc.
6476
6477376---------------------------------------------------------
6478From Volker Dirr:
6479
6480Disable energy saving mode, because FET won't calculate anymore if
6481the computer falls into save mode after x minutes.
6482
6483377---------------------------------------------------------
6484From Nagendra (on forum):
6485
6486https://lalescu.ro/liviu/fet/forum/index.php?topic=4050.msg21599#msg21599
6487
6488I request you to enable multi-selection (using 'ctrl' key) and range selection (using 'Shift' key) in time and space constraints also. So that
6489anyone can enable/disable/delete many constraints at once.
6490
6491Also from ChicagoPianoTuner, he suggests selecting and removing more constraints or activities at once.
6492
6493378---------------------------------------------------------
6494From CarolStott and Volker Dirr (on forum):
6495
6496- A teacher-subject matrix to enter teacher qualified subjects (so you
6497only need to enable/disable a cell in a table)
6498
6499379---------------------------------------------------------
6500From Volker Dirr:
6501
6502In the "Add activity" dialog:
6503Under the word "duration" (so left from the "active" checkbox) there is still
6504enough place to add some useful information.
6505I suggest to add the currently computed "Total duration".
6506
6507380---------------------------------------------------------
6508From Christoph Voelker and math (on forum):
6509
6510https://lalescu.ro/liviu/fet/forum/index.php?topic=4068.0
6511
6512They refer to the selection mark and the colors in the constraints activity(ies) preferred times and activities occupy max time slots from selection.
6513
6514381---------------------------------------------------------
6515From Nagendra (on forum):
6516
6517https://lalescu.ro/liviu/fet/forum/index.php?topic=4085.0
6518
6519Let us say a time table is generated with some constraints and locked. Now, If a faculty wants to re-schedule an activity, then if an interface as explained below
6520will be much more appealing.
6521
6522Stage-1
6523Say, Teacher-1 wants his lecture scheduled on Monday Morning 8:30 to be shifted to any other possible day&timing of his own timetable. So, we go to the particular
6524teacher's timetable and click on the box. If by some means, all the possible positions (satisfying all the constraints) where this lecture could be relocated gets
6525highlighted, then it would be great. Just like we play chess on a computer, and all possible moves of a chesspiece gets highlighted upon selection. Then a simple
6526drag and drop kind of thing.
6527
6528Stage-2
6529Teacher-1 wants his lecture scheduled on Monday Morning 8:30 (say Group A) to be swapped with some teacher-2 who is teaching the same student group (A), but
6530different subject. By showing both teachers timetable side-by-side and highlighting the boxes of teacher-2 upon clicking the lecture of Teacher-1.
6531
6532This is just a suggestion, definitely not very important. But, it will be very easy this way to modify timetable without breaking constraints, if we get some
6533swap requests.
6534
6535382-----------------------DONE------------------------------
6536
6537383---------------------------------------------------------
6538From Nagendra (on forum):
6539
6540https://lalescu.ro/liviu/fet/forum/index.php?topic=4104.0
6541
6542Add a constraint to limit the maximum number of subgroups (or number of students?) in any given time slot.
6543
6544384---------------------------------------------------------
6545From Diego Froner (on forum):
6546
6547https://lalescu.ro/liviu/fet/forum/index.php?topic=4128.0
6548
6549I use the import of CSV files too often because all my planning is made in Excel. One step of this planning is to choose a home room for some classes.
6550So, after all the imports, i have to set a home room for about 350~400 classes manually.
6551
6552My suggestion is to add a "column" in CSV for import "years, groups and subgroups" named "home room" which would be optional. It would automatically
6553add the respective "A set of students has a home room" constraint.
6554
6555Example:
6556
6557Year ; Number of Students ; Home Room
6558ClassA ; 10 ; Room 01
6559
6560This example will set "Room 01" as the home room for "classA" which has 10 students.
6561
6562Volker Dirr:
6563
6564a) we need to stay at the old csv file format, since several other projects already use it. So changes might be very critical in that file format
6565b) we should add all constraints in that files (not only home rooms). Similar to teachers and rooms.
6566c) Because a) and b) conflict each other we should add a second csv file format.
6567
6568385---------------------------------------------------------
6569From Volker Dirr:
6570
6571Split year dialog: It should be possible to sort the group names. I think manual sort (by using "up" and "down" buttons)
6572will be better than only alphabetic sort.
6573
6574386---------------------------------------------------------
6575From Ireri Venture:
6576
6577I would suggest you to add the constraint minimum continuous hours for a teacher.
6578
6579Advantages of min continuous would help a school like ours where there is sessions we do have where daily a teacher has minimum of 3 sessions
6580and we would wish one to have the capability of teaching 3 sessions continually and then rest or go home since the total sessions are 5.
6581
6582387---------------------------------------------------------
6583From Volker Dirr:
6584
6585there is a warning at the beginning if you generate about how to speed up by
6586deleting subgroups.
6587in my opinion that is very useful, since guys that work with such a file
6588can use it.
6589
6590first of all i thought it is a nice idea if i just do that improvement
6591in my source myself; so just not exporting those duplicated. but that
6592idea is bad, because there is a disadvantage: it won't be possible
6593to output a subgroup for every student. (only if you tell him: Mr. X,
6594please use the table of Ms. Y, it is the same table.)
6595So what do you think about the following idea:
6596there should be a feature to disable those duplicates.
6597so FET can generate the table fast.
6598as soon as you get the results you just open the saved data from the
6599results folder, enable the subgroups again and regenerate. By that they
6600will look fine.
6601
6602Liviu: It is a bit complicated, and also the constraints for these subgroups
6603should be the same (yes, in practice they will probably be the same).
6604
6605388---------------------------------------------------------
6606
6607Partially DONE in FET-5.40.0 (2019-09-25): the constraints of type teacher(s) max span per day allow one day exception.
6608
6609From Luca (on forum):
6610
6611https://lalescu.ro/liviu/fet/forum/index.php?topic=4177.0
6612
6613Allow a one day exception for the constraints of type teacher(s) max hours daily and teacher(s) max span per day, in which day the teacher(s)
6614can have +1 more hours/span.
6615
6616Additional suggestions by bachiri401: Allow a number of n days of exception for the constraints of type teacher(s)/students (set) max/min hours daily.
6617
6618Also suggested previously by totera:
6619
6620https://lalescu.ro/liviu/fet/forum/index.php?topic=3915.0
6621
6622Several teachers can work max 5 hours daily, but only once a week; in the other days the maximum is 4.
6623At the moment if in the generated timetable there is a teacher with two 5-hour days I add the constraint that all his activities occupy max 9 hours
6624in those days, but the problem presents again in other days or other teachers and it would be very laborious to add the constraints for all the
6625possible pairs of days. Is there any alternative solution?
6626
6627Also suggested by astigol on forum:
6628
6629https://lalescu.ro/liviu/fet/forum/index.php?topic=4284.0
6630
6631389---------------------------------------------------------
6632From Ireri Venture:
6633
6634Writing a custom text (like "Break") in the timetable instead of "-X-".
6635
6636There might be more break periods in the timetable. The HTML output should have a whole row/column with the name of the corresponding break
6637(possibly more names in the same timetable, like: "Lunch", "Supper"), written only once, and if on a column, written vertically.
6638
6639390---------------------------------------------------------
6640From Ireri Venture:
6641
6642The hours' names may be numbered starting with 1, 2, ..., and next to them, smaller, their time.
6643
6644391---------------------------------------------------------
6645From Aisse (on forum):
6646
6647https://lalescu.ro/liviu/fet/forum/index.php?topic=4283.0
6648
6649Hello .. I have a suggestion and I hope that you will try to achieve it .. Some data in the tables would be better to arrange in descending order
6650so that we do not have to go down every time .. For example when I click on the constraints of time: "All" appear the latest constraints in the
6651bottom .. I think it would be better to arrange  it in descending order, the last constraint appears first directly under the constraint Primary.
6652I am sorry again because my English is not strong .. I hope you understand my idea .. Thank you for all your efforts .
6653
6654392---------------------------------------------------------
6655From Zafar Allah Askar (on forum):
6656
6657https://lalescu.ro/liviu/fet/forum/index.php?topic=4313.0
6658
6659Add an option like in the custom FET for Morocco, in the Add activity dialog, a check box "Separately" for the selected students,
6660so that FET will add multiple activities, one for each selected students set.
6661
6662393-------DONE since FET-5.41.0 - 2019-11-18----------------
6663
6664394---------------------------------------------------------
6665From math (on forum):
6666
6667https://lalescu.ro/liviu/fet/forum/index.php?topic=4343.0
6668
6669I was wondering if it may be possible to introduce an active flag to teacher configuration (i.e. Data -> Teachers).
6670
6671Background: beside a core team of permanent teachers we have a large team of external teachers and contracted students. If somebody participates
6672in teaching for the first time, I'm adding him/her to the fet configuration as teacher. For the sake of laziness I'm only adding, but never removing,
6673because it happens quite often that external teachers return in later semesters. Even permanent staff is inactive from time to time, e.g. during
6674sabbaticals or visiting reasearch at other universities. And in fact, I do not only have to enter the name to the FET configuration but also the
6675internal ID from our SAP system. So I just want to omit the overhead of adding this information each and every semester again.
6676
6677But the downside of this approach is that my teacher listboxes grow in size quite fast. When defining activities or setting filters, I have to search
6678in a large list of teachers that might be significantly smaller, if only I would remove inactive teachers.
6679
6680Having an active flag would allow me to quickly toggle the status of all teachers at the beginning of the semester. If a teacher is toggled inactive,
6681he/she would not be added to listboxes. He/she would be also omitted in the schedule generation, i.e. no schedule is generated for this person.
6682
6683The only difficuly I see is how to handle this situation: what happens if a teachers gets toggled inactive while there are activities on his name?
6684I would suggest the following:
6685- When a teacher gets toggled inactive, FET checks whether there are activities for him/her. If yes, a warning dialog is displayed saying "There are
6686activities for this teacher. Are you sure?" If "no" is pressed, the teacher remains active. If "yes" is pressed, the teacher gets toggled inactive.
6687- If FET discoveres an inactive teacher at schedule generation time, it displays a warning ("Activity 1234 has been assigned to an inactive teachers),
6688but ignores the inactive teacher. (i.e. it schedules the activity as if the inactive teacher wouldn't have been assigned to the activiy).
6689
6690This behaviour would be beneficial for community activities, e.g. jour fixe meetings. I simply add all relevant teachers to the activity, not caring
6691if they are actually teaching this semester or not. By analyzing the active flag, FET would only schedule active teachers to these activities.
6692
6693The other option to handle this situation would be to reject toggling a teacher as inactive while he/she has activities.
6694
6695395---------------------------------------------------------
6696From Nagendra (on forum):
6697
6698https://lalescu.ro/liviu/fet/forum/index.php?topic=4365.0
6699
6700Say, activities are created with students and subjects (without teachers).
6701
6702Currently, FET assigns these activities to rooms (subjected to the constraints).
6703
6704Similarly, you can include an option to assign teachers automatically, if a user wants FET to do so. User may be given option to toggle/untoggle
6705the feature of assigning teachers automatically.
6706
6707This way the official FET can be used for both regular as well as exam timetables.
6708
6709396---------------------------------------------------------
6710(see also items #58, #149, and #368)
6711From uni_instructor (on forum):
6712
6713https://lalescu.ro/liviu/fet/forum/index.php?topic=4367.0
6714
6715You wrote to another request concerning this topic:
6716"Unfortunately, there is no Undo button, because it is too difficult to implement one now"
6717
6718As I see there a a few requests related to the missing UNDO function. (my own request included).
6719Some users made suggestions concerning possible solutions by using powerful CVS approaches like GIT or Mercurial.
6720
6721I know implementing a reasonable CVS in FET would be a tough job. So why not keeping it simple?
6722I remember there was a suggestion that I should do a manual versioning by saving my project data into new FET-files. That is what I am currently doing. Additionally I keep manual (paper) records and comments of my changes.
6723But it is always a hassle and error-prone to keep all my manual recordings up to date.
6724
6725So I would like to suggest a simpler approach:
6726
6727FET uses internal data structures to store all basic data and planing constraints and FET can save these data structures into a .FET file.
6728
6729How much programming effort does it cost to create dynamic duplicates in memory of these data structures? I know it will cost additional system-memory and a little bit of time for storing the data-duplicates, but modern computers are fast and provide Gigabytes of memory, so why should we care about a few hundred Megabytes of additional memory consumption? Actually the real additional memory consumption should be rather low, as I found from my own tests an measurements, since FET has a rather small memory footprint.
6730
6731I conceive that it should be possible to implement a mechanism for creating/duplicating and switching dynamically between these data structures. In that way it will be possible to keep a history of all (or the last #n) changes and to step back to an earlier planning stage if necessary. A step back would also delete all succeeding planning stages / sets of planning/constraint data.
6732Additionally it is possible to store in parallel some short (UNDO-) information that gives the user a hint about the last change steps. Furthermore the whole super-data structure (containing the current set of planning/constraint data and its predecessors ) could be saved into an extended .FET file, so that we can revert to previous planning stages even after a program restart.
6733
6734Below I added some figures illustrating my idea.
6735
6736  Dynamic pointer array/ buffer of max n stages
6737    \
6738     \
6739      \
6740  O    \
6741  |     \
6742  |     +--+
6743  +---->|#1|------|EOL
6744        +--+
6745         |  +-------+
6746         o--XInfo #1|
6747         |  +-------+
6748         |
6749         |
6750         |Step 1
6751     +---X-----+
6752     |Data #1  |
6753     |+---++--+|
6754     || A ||  ||
6755     |+---+|T ||
6756     |+---+|C ||
6757     || R ||  ||
6758     |+---++--+|
6759     +---------+
6760          A   Current stage
6761          |
6762          +----Data set containing
6763               room/activities/time
6764               constraints etc.
6765======================================================================
6766 Data structure after #n change steps
6767
6768  Dynamic pointer array/ buffer of max n stages
6769    \
6770     \                    UNDO/Revert back to step #2
6771      \                +---------------------------------+
6772  O    \               |                                 |
6773  |     \              V                                 |
6774  |     +--+          +--+          +--+                +--+
6775  +---->|#1|--------->|#2|--------->|#3|--------------->|#n|------|EOL
6776        +--+          +--+          +--+                +--+
6777         |  +-------+  |  +-------+  |  +-------+        |  +-------+
6778         o--XInfo #1|  o--XInfo #2|  o--XInfo #3|        o--XInfo #n|
6779         |  +-------+  |  +-------+  |  +-------+        |  +-------+
6780         |             |             |                   |
6781         |             |             |                   |
6782         |Step 1       |Step 2       |Step 3             |Step n
6783     +---X-----+   +---X-----+   +---X-----+         +---X-----+
6784     |Data #1  |   |Data #2  |   |Data #3  |         |Data #n  |
6785     |+---++--+|   |+---++--+|   |+---++--+|         |+---++--+|
6786     || A ||  ||   || A ||  ||   || A ||  ||         || A ||  ||
6787     |+---+|T ||   |+---+|T ||   |+---+|T || *  *  * |+---+|T ||
6788     |+---+|C ||   |+---+|C ||   |+---+|C ||         |+---+|C ||
6789     || R ||  ||   || R ||  ||   || R ||  ||         || R ||  ||
6790     |+---++--+|   |+---++--+|   |+---++--+|         |+---++--+|
6791     +---------+   +---------+   +---------+         +---------+
6792                                                     Current stage
6793
6794======================================================================
6795 Data structure after UNDO and revert to change step #2
6796
6797  Dynamic pointer array/ buffer of max n stages
6798    \
6799     \
6800      \
6801  O    \
6802  |     \
6803  |     +--+          +--+
6804  +---->|#1|--------->|#2| -----|EOL
6805        +--+          +--+
6806         |  +-------+  |  +-------+
6807         o--XInfo #1|  o--XInfo #2|
6808         |  +-------+  |  +-------+
6809         |             |
6810         |             |
6811         |Step 1       |Step 2
6812     +---X-----+   +---X-----+
6813     |Data #1  |   |Data #2  |
6814     |+---++--+|   |+---++--+|
6815     || A ||  ||   || A ||  ||
6816     |+---+|T ||   |+---+|T ||
6817     |+---+|C ||   |+---+|C ||
6818     || R ||  ||   || R ||  ||
6819     |+---++--+|   |+---++--+|
6820     +---------+   +---------+
6821                   Current stage
6822
6823----------
6824
6825Liviu Lalescu:
6826	Your ideas are interesting. I added your complete post in the TODO file. Thank you!
6827uni_instructor:
6828	Nice to read!   :)
6829	At least it would be a possibility to implement an UNDO feature without a complete rewrite of FET.
6830
6831Liviu Lalescu:
6832	To make a complete and perfect and memory efficient undo function would be a titanic task now, after all the code was written without undo in mind. And I admit I have no good knowledge of how to implement an undo function.
6833uni_instructor:
6834	I know, my suggested approach is not memory efficient and sophisticated, nevertheless it is a feasible approach.
6835
6836Liviu Lalescu:
6837	To implement what you are suggesting is also complicated. But I do not quite like it because of the memory waste. And saving a file with say 1000 undo versions might lead to a 1 GB file if the file has 1 MB (the internal memory consumption is lower than the .fet XML file).
6838uni_instructor:
6839	I don't think that all FET users will need an UNDO with 1000 levels. Even MS-Office does not offer an infinite UNDO. But as I wrote, modern computers have a lot of memory - so who cares.
6840	The number of UNDO-levels can be restricted, maybe an a user-defined setting. I think max. 10-25 UNDO-levels by default should be sufficient and this would not be such a significant memory waste.
6841
6842397---------------------------------------------------------
6843From Corfiot (on forum):
6844
6845https://lalescu.ro/liviu/fet/forum/index.php?topic=4368.0
6846
6847Corfiot:
6848
6849Would it be possible to add rule groups that one could enable/disable? This would be a ui-side thing and groups could be stored in the XML file separately from rules, so the rule storage schema is not affected.
6850
6851This would help a lot with creation of difficult timetables, you could group "easy"/"important" rules together, fiddle to get a schedule, then add more rules, fiddle, and repeat, adding more optional/nice to have restrictions.
6852
6853The UI would be about creating a group (name it) and then in the filter dialog of any rule display dialog add an option to add these rules to a group. Finally, a small dialog to display/delete rules from a group.
6854
6855How feasible is this?
6856
6857Liviu Lalescu:
6858
6859It is an interesting idea. The problem is that constraints do not have an ID, so you cannot specify exactly the constraints in a group.
6860
6861But Anthony Siaudeau and I have better ideas (there is an older custom version created for Anthony Siaudeau based on his suggestion). He suggested that a constraint can have a weight or a weight name. Weight names have modifiable values. You can create more weight names and assign them to the constraints. Then with only a click you can change the value of a weight name and thus modify the weights of more constraints at once. My idea is to do this also to enable/disable constraints (add some Boolean variables to be attached as the "enabled" state of some constraints). This is because many constraints can have only 100% weight, and they need to be disabled if you want this - their weight cannot simply be made 0.
6862
6863398------This will be DONE by Qt 6--------------------------
6864
6865In Qt 6 the classes QVector and QList will be united into QList, bringing the best performance of QList
6866(there will be no reason/need to convert QList to QVector).
6867
6868399---------------------------------------------------------
6869From math (on forum):
6870
6871https://lalescu.ro/liviu/fet/forum/index.php?topic=4370.0
6872
6873Meaning of colors:
6874
6875When enabling "Settings -> Interface -> Use colors", activities in time table dialogs (e.g. Timetable -> Students -> Days horizontal) are colored.
6876Do these colors have any meaning or are they selected randomly?
6877
6878Liviu Lalescu:
6879
6880The coloring code for the timetables was contributed by Marco Vassura, and I think he said it was a classical routine. The colors for the students'
6881timetables compute the color from the subject, while for the teachers'/rooms' timetable compute the color from the subject+students' names. The color
6882is random, but the same for the same string (same subject or same subject+students names).
6883
6884The HTML timetables with level 7 are similar, I think.
6885
6886math:
6887
6888Ah, ok, that's what I guessed.
6889
6890The reason I was asking was because I would wish for a different coloring scheme. We have multiple activities for one course. Beside a lecture and
6891an exercise, we also have tutorials, lab hours or central exercises. Hence there are multiple subjects for one course with very similar names, e.g.
6892"Programming 1 VL" (lecture), "Programming 1 UE" (exercise), "Programming 1 LAB", etc. I would like to see that activities with similar subject names
6893would get similar colors, so that it is clear on the first sight how the different activities of the courses are distributed over the schedule.
6894For instance, one could use the Levenshtein distance for determining the level of similarity between two subjects.
6895
6896Volker Dirr:
6897
6898Sadly "Programming 1 VL" and "Programming 1 UE" are different names, so the colours will be different. You might set "VL" and "UE" as a tag name,
6899so the names will be the same.
6900You might also check TiTiTo. Just import the dataset and export the table again, since you can select different colours with that tool.
6901
6902A second variant is that you colour yourself by the css file with html level 6.
6903
6904Liviu Lalescu:
6905
6906Yes, unfortunately the colors are based on a 24-bit hash, so they are (or should be) very different for even small changes. Unfortunately I cannot
6907do like you suggest. Maybe you can follow what Volker said.
6908
6909400---------------------------------------------------------
6910From Cyrus (on forum):
6911(see also entry #403)
6912
6913https://lalescu.ro/liviu/fet/forum/index.php?topic=4373.0
6914
6915Avoiding 4 sessions consecutive for teachers even when there is a break:
6916
6917How can one configure get to ensure teachers can never have 4 sessions consecutive with a break between (2-2) such that whenever a teacher teaches
69182 sessions followed by a break, one can only have one more and not two.
6919
6920Liviu Lalescu:
6921
6922I think of this: for each teacher, add n_days constraints activities occupy max time slots from selection, selected the 4 slots, max occupied = 3.
6923A lot of constraints to add, unfortunately.
6924
6925Cyrus:
6926
6927It's quite tedious to give the constraint to all teachers on daily basis. Wish there was a way of having like max time slots from selection for
6928all teachers. That would be better.
6929
6930Also suggested by Vangelis Karafillidis:
6931
6932For the max hours continuously constraints, add the possibility to except the breaks.
6933
6934401---------------------------------------------------------
6935From Volker Dirr:
6936
6937(inspired by this paper: https://www.herrmann-online.info/documents/bachelorarbeit.pdf)
6938
6939Write the rooms' free periods timetables in the HTML results. The rooms should be grouped by buildings.
6940
6941402---------------------------------------------------------
6942From Eric de Quartel:
6943
6944Is it possible to get the numbers of the activities in the HTML timetable. It makes it easier to communicate when changes have to be made.
6945
6946(Eric refers to writing the id-s of the activities in the HTML timetables, and maybe adding a check box for this.)
6947
6948Volker Dirr:
6949
6950print it in the first line or the last line?
6951
6952Eric de Quartel:
6953
6954Second line I think. Is very helpful.
6955
6956Volker Dirr:
6957
6958hmmm...
6959that id's might help the timetablemaker who use the fet gui. but i guess
6960it will only do trouble for students and "normal" teachers. those guys
6961can always say "in table x, day y and hour z" (of course that are 3
6962numbers/names, but it 100% clear. no wasting space on sheet, no swapping
6963id number with room number or students year, no explaining need why
6964there is that strange number, ...)
6965so shouldn't it be in the GUI only, but not in html table?!
6966
6967403---------------------------------------------------------
6968From Cyrus (on forum):
6969(see also entry #400)
6970
6971https://lalescu.ro/liviu/fet/forum/index.php?topic=4391.0
6972
6973I have used the constrain on 'a set of activities occupies max/min slots from selection' and its amazing though tedious more so when you
6974have putting all teachers and classes. Is it possible we have a general constrain for all teachers and students such that it will be easier
6975to put constrains revolving around all teachers and students? If it can be there, it can really help alot
6976
6977404---------------------------------------------------------
6978From Volker Dirr:
6979
6980(since i am currently doing again a very difficult timetable and i think it will be useful for those very difficult tables):
6981
6982optional enable in the settings "write highest stage solution if running out of generation time".
6983
6984405---------------------------------------------------------
6985From Liviu Lalescu and Zsolt Udvari (on forum):
6986
6987https://lalescu.ro/liviu/fet/forum/index.php?topic=4399.0
6988
6989Maybe "fet-cl --version" should not create a new directory and a log file in it in which to write the FET version, but should output this information only
6990on the screen. Maybe this should also be the behavior when the generation of the timetable does not begin because of incorrect command-line arguments.
6991FET command-line creates the "logs" and possibly the "timetables" directories in the output directory (which is the current working directory if none given
6992as an argument) and some logs files in these directories.
6993
6994406---------------------------------------------------------
6995From Vangelis Karafillidis:
6996
6997About our discussion for this feature. In real life timetabling problems, schools need to change their timetable from time to time.
6998It's crucial to change the timetable as little as possible. So, when the timetable needs to be changed (for example a new teacher is hired),
6999it would be really useful to preserve the day(s) of the activities. As you can understand, this is useful for already generated timetables.
7000So, in the same way that one locks/unlocks activities, he could additionally have the option to preserve the day(s) of selected activities.
7001The locking/unlocking activities, should be independent from the preserve day(s) option. In the already existing views of the generated timetable
7002for locking/unlocking activities, the user could be able to select the activities for which the day(s) should be preserved.
7003This could be done by adding already existing constraints, such as preferred time for activities (I don't remember the exact title of the constraint).
7004At the same time, the user should be able to remove specifically these constraints, without affecting the ones that he has added "manually".
7005As you told me, this might be done by adding a comment for these constraints. It might be implemented in another way... I don't know.
7006So, in the locking/unlocking activities views, the preserve day(s) could be added. Also, an option for removing "automatically" all these constraints
7007should be added. What do you think?
7008
7009Liviu Lalescu:
7010
7011The constraint you refer to is "activity preferred starting time". It
7012has a special attribute, "permanently locked" (true or false). True is
7013for manually added, and cannot be removed/unlocked automatically. False
7014is for automatically added, and will be removed/unlocked automatically.
7015
7016It is possible to add a new attribute like this to the constraints of
7017type "activity preferred starting times/time slots". But it is a bit
7018complicated and will complicate also the structure of the data.
7019
7020407---------------------------------------------------------
7021From Vangelis Karafillidis:
7022
7023In the Timetable view dialogs: add a button, so the user can add an activity tag + a comment for the selected activities
7024and maybe add the option to modify a selected activity.
7025
7026408---------------------------------------------------------
7027From Darren McDonald (on forum):
7028
7029https://lalescu.ro/liviu/fet/forum/index.php?topic=4151.msg24155#msg24155
7030
7031Darren proposes different icons for the custom versions, and other things:
7032
7033I've had some thoughts about the FET app icon (both the standard and custom versions).
7034
7035What do you all think about a text-free icon? (So, perhaps just the box, with a different coloured box for the custom versions.)
7036In any event, it would be useful to have higher resolution icons (even if the icon design goes unchanged), so this might also be
7037an opportunity to refresh the icon design itself.
7038
7039409---------------------------------------------------------
7040From Francesco Rizzo:
7041
7042He proposes a filter teacher combo box in the all time constraints dialog (as opposed to writing the name of the teacher in the
7043advanced filter there).
7044
7045410---------------------------------------------------------
7046From bachiri401:
7047
7048The students should keep the same room for a selectable 1, 2, 3, or 4 hours in a row (he is using FET for Algeria, but suggests that
7049this might be useful also for the official FET and for other FET custom versions).
7050
7051411---------------------------------------------------------
7052From Peter Johnson (on forum):
7053
7054https://lalescu.ro/liviu/fet/forum/index.php?topic=4463.0 (Posted on 22 May 2020)
7055
7056When I was using an old version of FET, I could have a "student home room", "teacher home room" and for those activities that its
7057teacher and student has "home room" constraint, I could define an "activity preferred room'. In this way, FET was ignoring the student
7058and teacher's home room constraints and just consider the "activity preferred room". But now that I have switched to the new version,
7059it says "Cannot generate timetable, because for activity with id==1 you have no allowed home room (from constraints students set home
7060room(s) and teacher home room(s))".
7061
7062What I need is that a teacher T1 has many classes, and they should be in his home room by default. The same holds for a student set S1,
7063but the teacher T1 has just one specific class with S1, and it can be in another room (maybe in T1's home room, or S1's home room or any
7064other room). Is there any solution to use the new version of FET and apply this, or I have to use the old version?
7065
7066Liviu Lalescu:
7067
7068I assume you have problems with a file like the attached one (teacher home room 100% to R1, students set home room 100% to R2, and preferred
7069rooms 100% for that subject to R1 and R2). But I tried with FET-5.27.3, release about 5 years ago, and it behaves like the current
7070FET-5.44.7, refusing to start the generation because of conflicting home rooms constraints. (FET-5.44.7 was released on 20 May 2020
7071and FET-5.27.3 was released on 9 June 2015.)
7072
7073Yes, I admit, you are right. I don't remember exactly the reasons for this behavior, but I think there was a reason. I will think about
7074it, but for the moment I think it should remain like it is. It is risky to change old code.
7075
7076412---------------------------------------------------------
7077From bachiri401:
7078
7079The constraint type teacher room not available times - this constraint is available in the custom FET-MA version, but not in the official FET.
7080
7081413---------------------------------------------------------
7082From math (on forum):
7083
7084https://lalescu.ro/liviu/fet/forum/index.php?topic=4524.0
7085
7086In Time->Students it's possible to specify "Max gaps per day/week", but this applies to ALL activities. Since I do not care for gaps
7087between e-learning activities, I cannot use that constraint.
7088
7089I'm thinking about something like Time->Tags->"Max gaps per day/week". This way I could tag all on-campus activities and define a
7090maximum of gaps (=0) between them.
7091
7092Or maybe Time->Activities->"Max gaps per day/week for a set of activities". Here I would define the set of on-campus activities and
7093define a maximum of gaps (=0) between them.
7094
7095414---------------------------------------------------------
7096From Volker Dirr (on forum):
7097
7098https://lalescu.ro/liviu/fet/forum/index.php?topic=4552.0
7099
7100i think we can see it also with algorithm, but it is a bit work. we need to run through all activities of an teacher. if all his activities are
7101not available in the same slot, then also the teacher is not available in that slot.
7102
7103(Liviu: Volker refers to subsequently detecting that the teacher has too little free slots for all his activities, when the user added
7104a lot of constraints students set not available.)
7105
7106415---------------------------------------------------------
7107From henriquebelo (on forum):
7108
7109https://lalescu.ro/liviu/fet/forum/index.php?topic=4568.0
7110
7111We have to change the teaching time and make sure that the class breaks are not met.
7112I divided the teaching time into 4, blocks of 15 min, and a class starts at 8:45 am and another at 9:00 am, so it is possible to find the breaks,
7113but I cannot use the Breakes constraint, because it is common for all students.
7114
7115I used the constraint A Student’s set not available times, for each class, where I marked the desired breakes.
7116
7117This constraint does not allow me to use the other constraint that I used a lot, two activities are consecutive, so that I can have one activity
7118before the break and another after the break.
7119
7120Is it possible to create a new condition in Breakes to choose classes?
7121
7122416---------------------------------------------------------
7123From samantha.goddard (on forum):
7124
7125https://lalescu.ro/liviu/fet/forum/index.php?topic=4571.0
7126
7127When viewing the group timetables in the 'View timetables / View student timetables / day horizontal' tab, is it possible to hide the long list
7128of subgroups that appear in each time slot so that the timetable is easier to view?
7129
7130I am spending a lot of time adjusting the size of the boxes to be able to check for distribution of activities.
7131
7132417---------------------------------------------------------
7133From Benahmed Abdelkrim (on forum):
7134
7135https://lalescu.ro/liviu/fet/forum/index.php?topic=4601.0
7136
7137Can be added this functionality: allow in dialog boxes to select multiple elements once and drag them to the adjacent field. It could save precious time.
7138
7139418---------------------------------------------------------
7140From Marcus (on forum):
7141
7142https://lalescu.ro/liviu/fet/forum/index.php?topic=4636.0
7143
7144I don't know if I am outdated or overlooked. If there is no such constraints mentioned below , may I suggest it.
7145
7146Some time we may not want the students to move so far away even when the rooms are in the same building. I limited the choices of rooms of activities by manually .ark a set of suitable rooms in the space constraints. The choices are highly based on the distance between rooms but it may be difficult for the users to mention the distance in many ways in the program.
7147What if we introduce a coordinate system for the rooms so that the program can calculate the horizontal and vertical distance between rooms? And thus set the space constraints based on the calculated distances?
7148
7149I don't know if this is a practical idea.
7150
7151Liviu: Marcus also attached a picture to his suggestion, see the forum link.
7152
7153419---------------------------------------------------------
7154From nguyenhuuduyet (on forum):
7155
7156https://lalescu.ro/liviu/fet/forum/index.php?topic=4501.msg25772#msg25772
7157
7158About the FET-MA custom version:
7159
7160I want when entering the teacher's name will be displayed immediately like the official version.
7161Example: 1. Enter the teacher's name
71622. Add
71633. OK
7164Then the teacher's name will appear in item 4
7165
7166(meaning the teacher will appear immediately in the list of all the teachers).
7167
7168---
7169
7170About the official FET version:
7171
7172I recommend adding functionality when importing activities in both official and custom versions.
7173I want the window on import to behave the same as the image I attached (combine the active dialog with the add activity)
7174For example:
71751. Enter teacher, subject, class ... click Add
71762. Click OK
71773. The activity will appear immediately item 3
7178If you do this, it will be very easy for the user to observe.
7179
7180420---------------------------------------------------------
7181From Fiorellino (on forum):
7182
7183https://lalescu.ro/liviu/fet/forum/index.php?topic=4653.0
7184
7185Excel/Open Office/Libre Office export of the timetable after it was generated.
7186
7187See also TODO items #18, #124, #152, #170, #300, #310.
7188
7189421---------------------------------------------------------
7190From daviodan:
7191
7192After you generate, you get a message box: "Timetable generated successfully", with a button "OK". Add another button, "See soft conflicts".
7193
7194Liviu:
7195
7196I do not like the idea, but I will write it down in the TODO.
7197
7198422---------------------------------------------------------
7199From Nando (on forum):
7200
7201https://lalescu.ro/liviu/fet/forum/index.php?topic=4748.0
7202
7203In Italian:
7204
7205Al terzo anno di utilizzo riesco a gestire con una certa facilità le problematiche della mia scuola. L'unico problema sono i tempi lunghi di elaborazione che però credo dipendano dai tanti vincoli presenti, tre plessi, prescuola, docenti in comune con altre scuole, richieste giorni liberi concentrati al sabato e lunedì ecc. L'ultimo orario ha impiegato circa 70 ore ma l'importante è che sia stato fatto.
7206
7207Nel chiedere se sono normali questi tempi di elaborazione, faccio notare delle cose che spererei fossero migliorate:
7208
72091) Perchè e possibile mettere delle eccezioni più restrittive e non estensive? Esempio num max ore buche per tutti i docenti (3), si può impostare un numero inferiore (2) ma non maggiore (4). Idem per numero giorni a settimana per tutti i docenti, si può mettere l'eccezione in meno ma non in più.
72102) A mio parere alcune criticità del programma dipendono dal fatto di non avere sufficienti ore disponibili da collocare in alcune classi in determinati giorni (esemio il sabato con tanti docenti col giorno libero mi sono trovato a non avere la disponibilità oraria necessaria per coprire tutte le classi. 12 classi su tre plessi necessitavano di 12x5= 60 ore mentre  i docenti disponibili me ne potevano garantire 58) in questo caso il software non segnala niente, semplicemente non porta a termine l'elaborazione. Sarebbe opportuno avere un report che indichi il num. max di ore disponibile nei vari giorni in modo da evidenziare eventuali criticità prima dell'elaborazione.
72113) La stampa per "classi", "tempo verticale per giorno"  dell'orario ha sempre la prima colonna molto stretta, c'e modo di modificarla?
7212
7213423---------------------------------------------------------
7214From Adele and Volker Dirr (on forum):
7215
7216https://lalescu.ro/liviu/fet/forum/index.php?topic=4751.0
7217
7218Enable/Disable activities in FET->Data->Activities and FET->Data->subactivities similar to enable/disable constraints in FET->Data->Constraints
7219
7220424---------------------------------------------------------
7221From Vangelis Karafillidis:
7222
7223Import not available constraints for teachers and students from CSV files.
7224Overall matrix view of not available times in the FET interface.
7225
7226Also from Fritzlang, on the forum (https://lalescu.ro/liviu/fet/forum/index.php?topic=5010.0):
7227
7228FET importa alcuni file con le impostazioni principali in formato CSV
7229E' possibile in qualche modo importare anche le ore di assenza degli insegnanti ossia le ore non disponibili per ogni singolo insegnante
7230
7231425---------------------------------------------------------
7232From Vangelis Karafillidis:
7233
72341) Define custom sets of teachers and students, and apply constraints for them.
7235
72362) Output an HTML-like view of all the constraints. Vangelis also suggests the teachers not available to be displayed in a time horizontal view.
7237
72383) it might be useful.. to add a "locked" button.. in the generated timetables view...
7239for... "unlocking" advanced manipulations...
7240"manipulations"... I mean automated but controlled modifications...
7241and not manual adjustments....
7242
7243after generating a timetable..
7244one can open the generated timetable view...
7245for locking/unlocking activities...
7246
7247in this dialog... it might be useful to add a button...
7248(with a "locked" icon)
7249so the user can open an advanced manipulations dialog...
7250for example...
7251it would be useful for the user...
7252to be able to select a teacher...
7253and modify the "not available times" from this dialog...
7254and work with the generated timetable...
7255the same if selecting for example two activities... which are consecutive, without this being acceptable... in order to add a constraint... and make them not consecutive...
7256etc...
7257so.... if the user selects teachers... he should be able to modify the constraints concerning these specific teachers...
7258if the users selects students...
7259he should be able to... blabla...
7260if the user selects SETS OF TEACHERS (the new feature I mentioned)... he should be able to add constraints for the entire selected set...
7261and the same for activities...
7262complicated..
7263but...
7264I think it would be much more functional for modifying EXISTING (generated) timetables
7265
7266426---------------------------------------------------------
7267From bachiri401:
7268
7269The possibility of choosing the colors in the timetables, instead of arbitrarily assigning random ones.
7270
7271427---------------------------------------------------------
7272From Volker Dirr:
7273
7274Add the possibility of generating multiple with multi-threading for fet-cl (FET command-line).
7275
7276428---------------------------------------------------------
7277From Vangelis Karafillidis (on forum):
7278
7279https://lalescu.ro/liviu/fet/forum/index.php?topic=4795.msg26561#msg26561
7280
72814) I think that FET works very well for solving timetables which do not need to be changed/modified during the school year. In my country (Greece),
7282most of the time teachers are hired "incrementally". So, most Greek schools need to change/modify their timetables around 10-15 times even up until April!
7283This means that one needs to be able to easily change/modify an already existing timetable. Under this perspective, a new feature of adding/removing/modifying
7284constraints on a existing timetable (in addition to locking/unlocking activities) would be highly useful. What about other countries? Do you need to modify
7285existing (FET generated) timetables during the school/academic year or not?
7286
72875) Sometimes, I needed to add identical constraints for the vast majority of teachers (for example max hours continuously = 4), while at the same time
7288a couple of teachers were an exception. I think that a new feature for adding constraints for (predefined) groups of teachers/students/rooms would be highly useful.
7289
72906) The constraints teachers/students/rooms not available times sometimes cause problems. I think that adding a button for displaying a report for
7291all teachers / all students / all rooms not available times would simplify the monitoring of these constraints. Especially, I think that for
7292rooms not available times with a weight <100, displaying the weight percentage in each time slot would be very useful.
7293
7294Another topic by Vangelis Karafillidis:
7295
7296https://lalescu.ro/liviu/fet/forum/index.php?topic=4797.0
7297
7298In my country (Greece), schools need to modify their timetables quite many times during the school year. The reason is that not all teachers are hired
7299at the beginning of the school year. Actually, teachers are hired "incrementally". So, up until February (or even March/April) schools need to change
7300their timetables, each time new teachers are hired. The problem is that there is a practical necessity of modifying the previous (existing) timetable
7301in such a way that each day "preserves" its activity content as much as possible.
7302
7303My suggestion is to add a button at the generated timetable view, so the user could select the activities he/she wants and add a constraint,
7304so that the selected activities would be placed in the new timetable in selected time slots. In this way, the timetable will change of course,
7305but it would not affect the test planning of the school, etc.
7306
7307What do other users think? Would this feature be useful for their schools? Greece might be an exception... Who knows?
7308
7309Alex Chernous:
7310
7311Fully agree. Lock time mean the one time slot, but in this case, it is necessary range of slots, usually one particular day, for all activities
7312in this range. For some teachers and some groups, I add special constraint for this, but not all of them.
7313
7314Greece not an exception. I live in Crimea, and I changed timetable 8 times in this year.
7315
7316429---------------------------------------------------------
7317From bachiri401:
7318
7319The idea of threads = many instances of fet on the same file
7320
7321We used to run two (for example) instances of fet with the same file but this file is copied and renamed with a new name so as not to be confused
7322We run them to generate multiple timetables
7323One of them may generate 5 timtables whreas the second will genarate only 2 ……….
7324
7325This new idea of threads is so useful but it should as the previous one:
7326Each thread is given the number of timtables to generate (should be optional to the user)
7327Each generated timtable will be given the name (thread number+timtable number) eg 1.1
73281.2
7329
73302.1  2.2 ………………
7331
7332430---------------------------------------------------------
7333From bachiri401:
7334
7335He suggests that the constraints of type max room changes per week to consider the week as a whole. For instance, if the max room changes per week is 0,
7336we need to have the same room all over the week. Now the behavior is that on day 1 we can use room R1, on day 2 room R2, on day 3 again R1, and so on.
7337
7338Liviu Lalescu: I think this is impossible to change now, and incorrect. You could use the constraint activities occupy max different rooms.
7339
7340431---------------------------------------------------------
7341From ghani1990 (on forum):
7342
7343https://lalescu.ro/liviu/fet/forum/index.php?topic=4795.msg26796#msg26796
7344
73451) I have a suggestion in the case of multiple timetables why I should delete the output folder every time, why the files are not output in new folders with
7346the same name with a number's suffix , 1,2,3 etc.
7347
73482) I suggest adding settings to choose the default mode of operation.
7349
7350Meaning instead of choosing the The mode of operation every time through the menu New, just I go once to settings and i set my default option.
7351
7352Why should this preferance exist? Because the Custom FET versions are basically each one belonging to a specific country or group, so I think it is better for
7353me to choose the mode once in the settings instead of choosing every time I create a new file!
7354
7355Thus, your work is wonderful in the endeavor to collect all copies in one copy, and at the same time it is easy to use the program as if it is directed to a
7356specific mode.
7357
7358Of course, these settings are optional, they can be edited by the user, or they can be left as they are now.
7359
7360432---------------------------------------------------------
7361From Volker Dirr:
7362
7363In src/engine/generate.cpp and src/interface/timetablegenerateform.cpp and src/interface/timetablegeneratemultipleform.cpp, use std::atomic instead of
7364std::mutex on the Boolean variable testing if the generation was stopped, bool Generate::abortOptimization. And maybe use std::atomic instead of std::mutex
7365in other places.
7366
7367433---------------------------------------------------------
7368From Khelifi Fouad Mohssen:
7369
7370If I (Liviu) understood correctly, he suggests to make the overall timetable, but to see it separately for each department.
7371
7372434---------------------------------------------------------
7373From Darren McDonald and samantha.goddard (on forum):
7374
7375https://lalescu.ro/liviu/fet/forum/index.php?topic=4839.0
7376
7377For block planning mode:
7378
73791) Activities occupy max hours (blocks). For instance, if there are 3 sets of simultaneous activities, the user would like that they occupy at most 2 hours:
7380FET day 1 FET hours 2 and 3 and FET day 3 hour 3 (suggested by Darren McDonald and Samantha Goddard).
7381
73822) Activities not same hour (block) if in different days (suggested by Samantha Goddard).
7383
7384I do have another suggestion that would help with block planning (that may also be useful more generally). When selecting a set of activities
7385(for time constraints, etc.) it would be very helpful if there were a way to select all activities that do not have a specific activity tag,
7386teacher, etc. Would it be possible to add something like a "not" checkbox, or equivalent, to use when filtering activities? Very often with block planning
7387I have restrictions that should apply to all courses except one, so this would be very useful.
7388
7389435---------------------------------------------------------
7390From djm (on forum):
7391
7392https://lalescu.ro/liviu/fet/forum/index.php?topic=4874.0
7393
7394He suggests the possibility to change the duration of all the activities multiplied/divided by a factor. For instance, if in reality the activities
7395have duration 50 minutes and they would like an activity to have 5 x 10 minutes duration. So all activities can be easily edited with a single click.
7396
7397Liviu Lalescu: This would be unfortunately a probably very seldom used facility. The user could use find+replace on the .fet XML file instead.
7398
7399436---------------------------------------------------------
7400From Henrique Belo (on forum):
7401
7402https://lalescu.ro/liviu/fet/forum/index.php?topic=4938.0
7403
7404A lot of times we need to disable some activities, and to do that we need to enter the activity and unselect Active check box.
7405
7406In the list of time and space constraints there is a button that can enable and disable the constraint, I think this is very useful to us in the activities list.
7407
7408437---------------------------------------------------------
7409From Mohamed Ait Ichou (on forum):
7410
7411https://lalescu.ro/liviu/fet/forum/index.php?topic=4940.0
7412
7413As for the relative weight, which is mandatory to be 100%, it is suggested to hide it from the user because it is not originally allowed to reduce it
7414to a lower percentage.
7415
7416438---------------------------------------------------------
7417From Henrique Belo (on forum):
7418
7419https://lalescu.ro/liviu/fet/forum/index.php?topic=4942.0
7420
7421He suggests to add in the timetable view dialogs, in the details for the activity in the current selected slot, also the constraints which are related
7422to this activity.
7423
7424439---------------------------------------------------------
7425From uni_instructor (on forum):
7426
7427https://lalescu.ro/liviu/fet/forum/index.php?topic=4830.0
7428
7429The most recent version of FET 6.0.2 does not support ALT-hotkeys for the menu bar.
7430I have attached two screenshots of version 6.0.2 and 5.49.1
7431
7432As you can see, FET 5.49.1 supports ALT-hotkeys whereas FET 6.0.2 does not.
7433Applying ALT+F should open the file menu but there is no reaction.
7434
7435Liviu: This is done by me. The reason is that on at least one platform, GNU/Linux with XFCE, my computer, the fields with accelerators appear shortened
7436in a bad way, like "&Institu ... mation" or something like that, when using the new Qt 6. So I decided to remove the Alt accelerators in FET version 6,
7437considering that they are not used by anybody, since anyway the mouse is much more important in the constraints, where there are no accelerators, and
7438the mouse is needed almost everywhere.
7439
7440Also suggested by rjmillett (by email to Liviu Lalescu):
7441
7442please consider keyboard shortcuts
7443Like
7444alt+f for file or similar
7445alt+d for data or similar
7446
7447currently we use alt + down arrow, etc to navigate by the keyboard
7448
7449it helps whenever the mouse gives trouble
7450
7451440---------------------------------------------------------
7452From aroby (on forum and by email):
7453
7454https://lalescu.ro/liviu/fet/forum/index.php?topic=4960.0
7455
7456Between each two uses of a room from two activities with at least one students set attached to them, leave a pause of 1 hour (or a selectable integer
7457number of hours). This is done to ensure room sanitation due to Covid-19.
7458
7459441---------------------------------------------------------
7460From Khineche Kaddour (on forum):
7461
7462https://lalescu.ro/liviu/fet/forum/index.php?topic=4977.0
7463
7464sometimes we need to change the weight of "constraint min days between a set of activities" for one teacher or one Subject in one time
7465so can you please add it in filter ?
7466
7467(in the filter of changing multiple constraints min days between activities with a single click.)
7468
7469Liviu: it would complicate the dialog. Instead, you could go to the all time constraints and apply a filter, then you can manually modify
7470the necessary constraints (I doubt there are too many for a single teacher - hmm, but for a subject there might be many).
7471
7472442---------------------------------------------------------
7473From sasbland (on forum):
7474
7475https://lalescu.ro/liviu/fet/forum/index.php?topic=4988.0
7476
7477I wonder if there is a way to set the colours so that for the same subject, it shows the same colour in both student's and teacher's timetable.
7478At the moment, we often view the student's and teacher's timetable at the same time when we need to move classes around. It would help very much
7479if the same subject is in the same colour.
7480
7481Liviu:
7482
7483Now the colors are based on subject for students and on subject+students for teachers. We did it like this because usually the teacher teaches the same subject.
7484I will add this in the TODO list (for the official FET): A selectable FET setting "Color the teachers' activities by subject versus by subject+students".
7485
7486443---------------------------------------------------------
7487From ben bacha sami:
7488
74891-      J'ai  plus que 50 enseignants :  si je mets limite vide par
7490semaine (par exemple) pour tous les  enseignants =2h
7491et si je veux qu’un enseignant X a limit vide par semaine =1h , je
7492dois préciser à chaque enseignant apart  (limite vide par semaine=2h)
7493solution : les contraintes pour un enseignant doit être prioritaires
7494en face des contraintes pour tous les enseignants.
7495
7496Même chose pour un groupe et tous les groupes
7497
74982-      Je suggère  -pour les salles d’ajouter :
7499  limite heure / semaine- / jour
7500  limites vide/jours -/semaine
7501
75023-      Problème d’optimisation :
7503une école qui  possède 12 classes dans un seul niveau
7504chaque classe possède 3 matières de base –M1-M2-M3
7505
7506Pour M1 en a 6 enseignants
7507          M2 en a 4 enseignants
7508          M3 en a 3 enseignants
7509peut-on ajouter a fet une fonction qui peut optimiser l’affectation
7510des  enseignants au classes pour un emploi idéal.
7511
7512Liviu:
7513
75141. If you have max gaps for all teachers = 2 and for a teacher max gaps
7515= 1, it will work correctly. Yes, you are right for min hours daily,
7516for instance; in this case you need to add individual constraints. It
7517is difficult to change now.
7518
75192. and 3. are unfortunately too difficult/impossible.
7520
7521444---------------------------------------------------------
7522From fartoto_dz2004 (on forum):
7523
7524https://lalescu.ro/liviu/fet/forum/index.php?topic=5003.0
7525
7526i want to suggest a constraint for M-A mode that might be useful for me and others; i hope you can add a constraint that let two different teachers
7527start at same time (seance) or end at same time.
7528