"Fossies" - the Fresh Open Source Software Archive

Member "fet-5.45.1/TODO" (29 Jun 2020, 333709 Bytes) of package /linux/privat/fet-5.45.1.tar.bz2:

As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the latest Fossies "Diffs" side-by-side code changes report for "TODO": 5.45.0_vs_5.45.1.

    1 1----------------------------------------------------------
    2 From Liviu Lalescu:
    4 These are some rather technical problems, for developers, referring to some possible improvements in the generation code:
    6 In the initial order, in nIncompatible, consider also teachers(students)intervalMaxDaysPerWeek, like in teacherMaxDaysPerWeek
    8 Make students max gaps per day perfect. This is very difficult/complicated. Any bug/mistake would be critical.
   10 2----------------------------------------------------------
   11 From Volker Dirr:
   13 Disable menus and shortcuts (in FET main form) if they are currently not
   14 usable. For example: Disable teacher constraints, if there is no teacher
   15 in the dataset. Disable space constraints if there is no room in the
   16 dataset. (Disable means: Just make them unavailable/gray. Don't hide
   17 them. Do it like OpenOffice.org, Firefox, etc.)
   19 3----------------------------------------------------------
   20 From Horatiu Halmajan:
   22 Max gaps constraints with weight under 100%
   24 Liviu: This is very difficult.
   26 4----------------------------------------------------------
   27 From Horatiu Halmajan:
   29 Horatiu:
   30 I met a situation: a teacher asks for maximum 2 working days, but these
   31 days should not be consecutive.
   33 Is there a way to implement it in FET?
   35 The only (manual) way I could think of, is to set the teacher as
   36 unavailable on Tuesdays and Thursdays, thus leaving him available on
   37 Monday, Wednesday and Friday (any two of these are unconsecutive).
   39 Any other ideas...?
   41 Liviu:
   42 I have another idea: add a dummy activity for this teacher, split into 2
   43 per
   44 week, min n days = 2, with 100%. You just need to take care that this
   45 teacher
   46 has place for these dummy activities (enough slots in the day) and to
   47 consider
   48 these dummy activities as possible gaps, so if teacher has max gaps 2 then
   49 make max gaps for him 0.
   51 Horatiu:
   52 For my case, the second idea worked perfectly, as my teacher does not accept
   53 gaps.
   55 I have also "played" with the first with the first idea, as it seems to be
   56 the most un-restrictive one. It also worked. I tried it three times, and in
   57 all three situations at least one of the dummy activities was the first or
   58 the last activity for the teacher's day. So, there is a chance that the
   59 teacher would end up with only one gap.
   61 Which leads me to a suggestion: An activity ends (or starts) a teacher's day.
   62 Similar to "an activity ends students's day".
   64 5----------------------------------------------------------
   65 From daviodan:
   67 I will refer to sample_Brazil_more_difficult_max_2_gaps_for_teachers.fet
   69 1. In the FET activities dialog there exist more filters after the teacher, group, etc.
   70 If we choose for instance the subject "Math" and we do the filtering also after the name of 
   71 the teacher, then the list of the filter should contain only the name: Bruna,Silvania,Wellington,
   72 because only these teach Maths. In the present moment the filter contains the list of all teachers.
   73 The same for all the other filters.
   75 2. In the teachers' statistics dialog, when we click a teacher, there should appear in the right
   76 in a box all the constraints for this teacher inputted by that moment.
   78 6----------------------------------------------------------
   79 From Volker Dirr:
   81 for code cleanup always use the same style:
   82 some constraint c have
   83 c->teacher_ID
   84 others have
   85 c->teacher_Index
   87 7----------------------------------------------------------
   88 From Azu Boba (modified/updated by Liviu Lalescu):
   90 About timetable view teachers: ... I propose is to 
   91 have fixed cell height and width so it would be easier to comprehend and 
   92 pinpoint what you see when switching between teachers. 
   93 We have a 3D table (teachers/days/hours). I propose to 
   94 add a new view named e.g. "View (day for teachers)" (of course you keep 
   95 the "View (teachers)" too). This view will be similar to "View 
   96 (teachers)" but it will have all the days as selectable tabs on the top. 
   97 The 2D table it will display below the tabs would be the Teachers/Hours 
   98 view for the day selected. The buttons and functionality will be the 
   99 same as in the case of "View (teachers)". ...
  100 The best part though is that with this 
  101 new View you will be able to better comprehend/modify the schedule in a 
  102 day by day base...
  103 You might also want to consider adding an additional flag when locking 
  104 an activity. This flag might be called "Save data and timetable flag" 
  105 and would be set when an activity is locked automatically during the 
  106 "Save data+timetable as..." procedure. Why? Mainly, because when you 
  107 want to unlock e.g. a specific day in a "Save data+timetable as..." 
  108 saved timetable you do not want to unlock all the activities of the day; 
  109 you want unlocked only the ones that were locked by the "Save 
  110 data+timetable as..." process. There are activities that the schedule 
  111 creator manually locked them before FET generated the table (e.g. a 
  112 specific lesson needs to happen only on a specific day and time). By 
  113 selecting and unlocking a whole day as things are now you unlock these 
  114 activities too! This means that if the schedule creator doesn't pay 
  115 enough attention he might mistakenly create a schedule with activities 
  116 set at undesired hours. The solution I propose to this is to toggle 
  117 between locked/unlocked only the activities that have the "Save data and 
  118 timetable flag" set. To unlock the manually locked ones the user would 
  119 have to do it in a different/manual way (see the paragraph below about 
  120 the editable "Details" box) or even better be asked with a message box 
  121 if he wants to unlock the manually locked activities too.
  122 I also mentioned that in order to remove a teacher from a specific day 
  123 (because he is ill or on a leave) I have to go to "View (teachers)" and 
  124 pinpoint all the activities assigned to the teacher for this day 
  125 (checking their IDs from the "Details" text box and then writing them 
  126 down in notepad). Then I close this view and go to the "Activities" 
  127 list, find the specific activities and uncheck "Active" for them. This 
  128 is a little annoying and a prone to errors procedure especially if there 
  129 are more than one teachers missing. What I thought as a solution for 
  130 this has to do with the "Details" text box on the "View (teachers)". It 
  131 would be great if it wasn't just a simple text box but an editable 
  132 interface for every changeable value. What I have in mind is to split 
  133 the "Details" into two parts; the upper part would include all the non 
  134 editable values while the lower part all the editable ones. Right now 
  135 for me, only the "Active" and "locked time" values are worth of being 
  136 editable, so  simple check boxes would suffice but someone else might 
  137 want other values editable too (e.g. Total number of students, duration) 
  138 or new values worth being editable might be added in the future, so it's 
  139 a good thing to have.
  140 Last but not least (and certainly the most difficult modification) it 
  141 would be great if you could drag and drop activities in the "View 
  142 (teachers)" and "View (day for teachers)" GUIs. Of course by doing so 
  143 you create conflicts and this will need handling. But I think all the 
  144 before mentioned changes are enough work for you now and I need to think 
  145 this a little more to come up with a viable solution.
  147 8----------------------------------------------------------
  148 From Marco Barsotti:
  150 The only thing that I would like to find in a future version of FET is the
  151 ability 1) to find when a combination of constraints is impossible to
  152 respect. 2) to recognize which constraints generate a bottleneck, where FET
  153 stand by searching the little hole where to pass and go on, placing
  154 activities.
  156 9----------------------------------------------------------
  157 From Saad (on forum):
  159 Manual improvements of the timetable.
  161 10---------------------------------------------------------
  162 From Volker Dirr:
  164 Change remove redundant to deactivate redundant.
  166 11---------------------------------------------------------
  167 From Volker Dirr
  169 I got reports from a user that he had trouble to find the correct
  170 output files today, because there were so many files in the directory.
  172 just maybe:
  173 maybe write only the index file into the result directory. then make 3
  174 subdirectories. one subdirectory with all html files, one with all xml
  175 files and one with all csv files. so we don't need the export menu
  176 anymore, because it is exported always by default and the directory is a
  177 little bit more tidy.
  179 12---------------------------------------------------------
  180 From Volker Dirr
  182 We have:
  184 1. category: 3-4 classes
  185 2. category: 5 courses
  186 3. category: 4 religions (always same time, so i didn't enter it)
  187 4. category: several working groups (after noon lesson, so i add them
  188 manualy)
  190 Now have a closer look:
  191 4 classes * 5 courses * 4 religion is already 80 subgroubs.
  192 so if i also add working groups (lets say 5, but there are more!)
  193 then we have total 400 subgroups.
  195 that is stupid, because i have only around 100 students in a year!
  197 i think in that case it is wise to enter data not in groups, add
  198 students
  199 individual.
  201 that is like high school do it.
  203 - add a year.
  204 - add groups (NOT with split year, but same names)
  205 - add a group ALL STUDENTS.
  206 - add subgroup with all students names into ALL STUDENTS.
  208 - now we need a table to every year:
  209 	- horizontal are the division names (must not be group names, but
  210 	can)
  211 	- vertical must be the student names
  212 	- every cell is a bool checkbox
  214 no the timetablemaker can check every single student. of yourse by
  215 checking the studentsname must be added as subgroup into that group.
  217 13-------------------------DONE----------------------------
  219 14---------------------------------------------------------
  220 From more users:
  222 Multiple processor - split multiple timetable generation on multiple processors
  224 15---------------------------------------------------------
  225 From Volker Dirr
  227 how about displaying "minimum home
  228 room hours" and maybe also "maximum special room hours" in the teacher
  229 statistics? because a timetable maker (maybe) need that for his
  230 planning.
  232 16---------------------------------------------------------
  233 From Danail Traichev:
  235 You see, this division in subgroups is very complicated - to understand 
  236 and to add by hand. And at the end you came with a lot of subgroups that 
  237 have only formal sense, for the algorithm, but are visible in dialogs, 
  238 in the final chart and everywhere. It should not be like this. One will 
  239 have to divide years in wizard-like dialog, with questions:
  240 1. How many classes you have for this year?
  241 2. Define courses for which students from this year study together
  242 3. Which of these curses start at same time. Group them by this criteria
  243 4. Define from which classes came students for these courses. Whole 
  244 class is caming, or only part of it? Where other part goes - have rest, 
  245 or has another activity, and if yes - which one?
  246 5. Define teacher that is teaching in every course.
  248 This is a draft, but some wizard like this will save *a lot of* 
  249 mistakes, and will make program much more user friendly. Then you can 
  250 add internal groups, but not show them to users, or at least show if 
  251 they set some option. Show them only groups and subgroups that they need 
  252 to put in activities, and show these same in final html output.
  254 This is my opinion of user in trouble :-)
  256 Second set:
  257 1. Ability to select more than one constraint and delete it, or set its 
  258 weight
  259 2. Ability to disable all informative and warning messages, or to display 
  260 them in status bar or in another log window.
  261 3. Option to remember last focused control in dialogs - very useful if 
  262 you want by keyboard to open many constraints and change their weight
  263 4. Constraint "longest gap is n hours"
  264 5. A way to save last generated timetable and reopen it again (for example 
  265 for printing it with different html level, or for viewing it.
  266 6. Ability to show free teachers for every position in students and 
  267 teachers timetable - very useful if you want to find somebody to replace you
  269 17---------------------------------------------------------
  270 From my80s:
  272 also in program we have
  273 a matrix with days x hours = n x n
  274 if this is allocated from some activity it should get error in
  275 precomputing in real time
  276 if we put another activity 100% in same cell
  278 that would take less time to find mistakes
  280 18---------------------------------------------------------
  281 From my80s:
  283 export as odt (OpenOffice.org) table (spreadsheet)
  285 See also TODO item #310
  287 19---------------------------------------------------------
  288 From Danail Traichev:
  290 If you make it how it is now with years, groups and subgroups, it will not
  291 be complicated for entering and even will not need change in most
  292 constraint dialogs. What I mean - define "groups of subjects", and allow
  293 "group of subjects" name to be used in every place where subject can be
  294 used. Much  like it is now with student sets - both student years, groups
  295 and subgroups are placed in one control and added from one place.
  297 But of course, I don't know how this will fit with FET internals. And FET
  298 is fine even without this. It simple will make entering constraints a bit
  299 easy. The other posibility is if every activity constraint dialog has a
  300 posibility to select multiple activities, and to filter them by "subject
  301 group", or at least by "selected subjects". That will make entering
  302 constraints like in my case easy.
  304 20---------------------------------------------------------
  305 From Volker Dirr:
  307 maybe it's possible to do Form::setLayoutDirection(Form::LeftToRight) only to the filename or language in menu.
  308 (bracket bug in Arabic translation)
  310 21---------------------------------------------------------
  311 From Volker Dirr:
  313 I saw at Les's timetable, that he called hour==period.
  314 also at wikipedia it´s called period. (see School_timetables chapter, terminology)
  316 I am not sure about that. in German we have the also the word "periode",
  317 but we don´t use it for timetables. we say hour.
  318 but maybe that´s just colloquial language. this colloquial language is ok,
  319 because the schools have 1 schoolhour (45 minutes) or 2 schoolhours (90
  320 minutes).
  322 but maybe it´s better to use also the word periode, because by this
  323 schools with 60 minutes activities (2 periods) and 90 minutes activities
  324 (3 periods) don´t get trouble with the word hour (because it entrap /
  325 ensnare /
  326 inveigle so write 1 hour and 1,5 hour. but "hour" is an integer values!
  328 but on the other hand people (maybe) will not understand immediately the
  329 word period.
  331 so maybe we should write "period (hour)".
  333 22---------------------------------------------------------
  334 From Volker Dirr:
  336 maybe change "current constaint" into "description", "constraint
  337 information", "description of the selected constraint", ... (very very low
  338 priority, maybe one day)
  340 23---------------------------------------------------------
  341 From Volker Dirr, regarding translation:
  343 1. maybe it's better to be more exact. example: phrases "min hour" better "min hour per day"
  345 2. sometimes the english version isn't always the same.
  347 sometimes you wrote "add current activity"
  348 sometimes you wrote "add activity"
  349 sometimes you wrote "add current"
  350 sometimes you wrote "add"
  351 i think it should always be the same.
  353 also sentence like: "You have to know that this constraint ..."
  354 should only be: "This contraint ..."
  356 3. maybe "start" should be "generate" in the generateform.
  358 4.	- if you wrote one or more sentences, please always end with ., ! or ?.
  359 	- sometimes you wrote "students subgroups", i think you just need to write
  360 	"subgroups", because teachers have no subgroups.
  361 	- all "add", "modify", and "remove", "close" phrases should only contain
  362 	this word. no more words like "current" or "group". maybe wrote them with
  363 	QObject, because nearly every dialog have this 4 phrases.
  365 5. i think we should think and write a small definition note for english
  366 phrases.
  368 it looks like in a few times this terms are not always used same/correct:
  369 hour
  370 duration
  371 period
  372 lesson
  373 activity
  375 when we write a small definition note, then we have to care about this:
  376 words must also be correct for schools that don't use "hours" as one time
  377 hour.
  378 in Germany one school hour is 45 minutes. but that's no problem. we use the
  379 same words for that.
  380 but i remember a letter, a user wrote that he has 60
  381 minutes hours and 90 minutes hours. so he defined 30 minutes "hours" and
  382 set duration == 2 or duration == 3 to the activities.
  383 so the definition and use of hour, duration, period and lesson must also
  384 match to this.
  386 please let us first a small definition not for this terms:
  387 hour, duration, periode, lesson, activity
  388 this will help if we add new or modify old english phrases and it will
  389 also help translators.
  391 6. maybe: no brackets in "view (students)", "view (teachers)", and "view
  392 (rooms)".
  394 7. and it looks like we shouldn't use the word "lesson".
  395 in the most phases it's better to replace "lessons" by "subactivities"
  397 8. that is also why i already asked you to change english translations,
  398 because some phrases can be shorten.
  399 for example all sentences with "you", "current" or "that mean" can be
  400 shorten (in english and german).
  401 example:
  402 "If you insert current group to current year, that means that some years
  403 share the same group (overlap)"
  405 shorten version:
  406 "Some years share this group if it's inserted."
  408 9. and a maybe other thing. example:
  409 view in fet-mainform.
  410 there is "Time contraints (techers)".
  411 and in this folder is for example "Teachers max gaps per Week".
  412 i recommend to write just "Max gaps per Week".
  413 Reason:
  414 - it's shorter
  415 - it's clear that it "teachers" contraint, because it´s in that folder
  417 the English version looks fine, because you are always possible to write
  418 first "teachers". (except on min days between activities. You
  419 are not able to write Activities first.)
  420 In German translation it is much more difficult the write "teacher" always
  421 first. even including the word teacher is a much longer phrases than in
  422 english. it will be much easier and nice, if we don't write teacher here.
  423 maybe the same problem in other languages.
  425 24-------------------------DONE----------------------------
  427 25---------------------------------------------------------
  428 From Volker Dirr:
  430 For multiple generation:
  432 Maybe add a checkbox "shutdown after job is done".
  434 26---------------------------------------------------------
  435 (see also entry #194)
  436 From Volker Dirr:
  438 long time goal: code cover planning.
  440 27--------------------------------------------------------
  441 From bmlahcen13:
  443 for that i advice to start thinking from now to
  444 - enhance the UI
  445 - use Database
  446 - add web client
  447 - use UML models
  449 and also for the structure, use "int id", this will
  450 enhance both runtime and will reduce the storage,
  451 because in the FET xml files, for example to store and
  452 activity, you have to write again the name of the
  453 subject, teacher, students and also the day and time
  454 slot in a solution. the same happens in time and space
  455 constraints, these 3 entities represent a big
  456 percentage of the size of the file, so you use int IDs
  457 and not names you will certainly gain a lot of space
  458 and also a better execution time, i know, as you said,
  459 that the internal structure uses int id but for
  460 loading and saving xml files and searching, the usage
  461 of strings delays them.
  463 Liviu: maybe it would be better to compress the input file
  465 28--------------------------------------------------------
  466 From more users:
  468 Improve the user interface - add help and wizard.
  470 29--------------------------------------------------------
  471 From Michael Towers:
  473 What about a rewrite of the front end in a scripting language - e.g. Python? It might speed 
  474 development and help debugging. It could also make maintenance of the code easier.
  476 Is there some way of doing "interactive" timetable development? The human would make 
  477 suggestions, or place some items, run the program, maybe move a few things around, run the 
  478 program again ...
  480 A clear and clean interface to your engine as an entity separate from the 
  481 input/output might be useful.
  483 It seems to me, it should be possible (but of course only after a lot of work!) to have 
  484 a beautiful manual timetable editor (which can also print the various timetables, and 
  485 perhaps save the data sets and results in a database) with an interface to an automatic 
  486 timetable scheduler which can be used to speed up the work."
  488 30--------------------------------------------------------
  489 From TheStar:
  491 A constraint to think about is that some activities, and I suspect 'normal school management'
  492 talks about teachers as in "One teacher per x students".
  494 In the HSC year here, it's about one teacher per 26 students (or something like that).
  495 At a recent excursion, it was one teacher per 10 students.  Hope that helps :)
  497 Liviu Lalescu: Of course, you can add each student. I could have implemented this solution.
  498 But I doubt that the user has such patience.
  500 You could always autogenerate the students...
  501 "Quick-Build Students"
  502 [Properties]
  503 [Number]
  504 (Build)
  506 And it will generate students with name: AutoGen-11231, ID: 11231, and the like.
  508 The user could then 'select' groups of these students... and... (Just an idea)
  510 31--------------------------------------------------------
  511 From Abdul Hadi Kamel:
  513 Do you have a plan in mind to upgrade the existing fet from standalone
  514 application to a client-server/web-based database oriented type of
  515 application in the future. This is because the current fet is quite limited
  516 especially in terms of timetable data which cannot be keyed-in /view s
  517 amongs several users at the same time. This will cause hardship because the
  518 people involved in making the class timetable in universities normally
  519 consist of several key persons from different departments. Using standalone
  520 application by several persons sometimes make data consolidation process
  521 among departments become difficult and error-prone
  523 I think it will be better if the FET can support a single timetable data
  524 repository (using client-server model) in a database that can be input/view
  525 by several users simultaneously.
  527 32---------------------------------------------------------
  528 From Volker Dirr:
  530 If you think that other people don't like this default constaint how about
  531 making a menu "default settings". there you can add "language" and my
  532 default wish. maybe there are other parameters, that can be set in this
  533 settings. I guess that there a people who want set duration to 2 or 4 by
  534 default.
  536 33---------------------------------------------------------
  537 From kdsayang:
  539 I would like to see FET generate the time table in
  541 1. certain amount of time for each time table
  542 2. with some setting about the remaining weight soft conflicts
  543 3. generate multiple variants
  545 For example
  546 (A) rules are
  547 (i) the user select to generate 10 minutes time limit for each time table
  548 (ii) user set 0 for remaining weight soft conflicts
  549 (iii) the user select 10 variants
  551 the outcome
  552 (B)
  553 (i) the time table finished and it has generate 10 time table that concur with 0 remaining soft conflicts for each time table
  554 (ii) the time table finish and it only manage to get 5 variants from 0 remaining weight soft conflicts
  555 (iii) the time table finish BUT it don't manage to generate any variants with 0 remaining weight soft conflicts
  557 refer to (B)(iii)
  559 the user can change
  560 (i) longer run time to generate time table (with crossing finger) hehe... Others setting is not change
  561 (ii) longer run time to generate time table with increasing value for remaining soft conflicts (0.5, 1.0, 1.5 etc)
  563 As you can see in timetable --> generate multiple variants, features in (A)(i) and (A)(iii) are already there. I hope that you
  564 can figure it out on how to implement the feature in (A)(ii). It would be marvelous.
  566 34---------------------------------------------------------
  567 From kdsayang:
  569 If a user want to add "an activity have a set of preferred rooms", the user will need to click one
  570 by one to add right???... So, I would like to suggest that we group them like when user want to add
  571 an "activity". There (activity), we can select by years, groups and subgroup for students. Instead of
  572 clicking all the student groups in years 1, user can just click year 1 to include them all into students....
  574 For example for rooms (room group then room subgroup)
  576 HALL
  577 Hall A
  578 Hall B
  579 Hall C
  582 A-A1
  583 A-A2
  584 B-A1
  587 Lab 1
  588 Lab 2
  589 Lab 3
  591 So when user want to add "an activity have a set of preferred rooms" for all the tutorial room, instead
  592 of clicking 20 tutorial room one by one, user just click the group that is Tutorial. Easy right???
  594 35---------------------------------------------------------
  595 From kdsayang:
  597 What I meant is in Data --> Time Constraints --> Teacher Time Constraints --> A Teachers not available time,
  598 1. If you double clicked Afida,
  599 2. It will show Afida not available time right.
  600 3. 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.
  601 4. So, if you want to change Sambilan not available time, you have to clicked Cancel button first,
  602 5. then double clicked Sambilan.
  603 6. Now you can see that Sambilan not available time is updated.
  605 My suggestion is that It will be better If FET can update to Sambilan from Afida in Step no 3.
  607 36---------------------------------------------------------
  608 From kdsayang:
  610 I have some other suggestion.
  612 1. It will be GREAT if FET can be turn to tree structure. We can show/hide the structure
  613 2. In the tree structure, we can use the copy, cut and paste to edit the subject, activities, etc in the tree structure
  615 37---------------------------------------------------------
  616 From kdsayang:
  618 If 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.
  620 So, I suggest that you can add a set of teachers not available time. Same as rooms not available time feature.
  622 38---------------------------------------------------------
  623 From kdsayang:
  625 On 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
  627 For 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.
  629 This feature is needed if my/our/your university/school is a big one where teacher and subject are hundreds.
  631 39---------------------------------------------------------
  632 From Zsolt Udvari:
  634 We've created a timetable but the rooms aren't. So we do it by hand.
  635 How can I change in FET the rooms simpler in a generated timetable?
  636 The times are locked.
  637 It would be the most simplier when I open e.g. the teachers timetable,
  638 click on a activities and I can add room to this.
  640 Liviu:
  641 I'm sorry, but you'll have to add manually constraints activity preferred
  642 room for each of the activities.
  643 I am not sure I understood correctly the problem, if not, please excuse me
  644 and explain more detailed.
  646 Yes, imho you understand my problem. I hoped that there is a simpler
  647 solution. So, maybe in the next releases would be nice: when a
  648 timetable is generated, user can changes/sets the rooms (only the
  649 activities without rooms of course) from the timetable (Timetable ->
  650 Show teachers/students): you select an activity, you click a button
  651 with "Assign room" and choose a room.
  653 40---------------------------------------------------------
  654 From Naji:
  656 Hopefully, FET's team can enhanced it to be able to export the xml data to database, that will facilitates the
  657 output of the data and enables programmers to engage it with their programs.
  659 41---------------------------------------------------------
  660 From Massimo Mancini:
  662 This is a request for a new feature...
  663 For 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:
  664 Theacher:  MANC, MANCINI
  665 Subjects: MAT, MATEMATICA
  667 I 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.
  668 I wish to output the brief (only BD) or complete (LD) timetables
  670 42---------------------------------------------------------
  671 From jaspal:
  675 On a particular day, faculty can be on leave, or may be busy with some 
  676 other work hence unable to take the assigned classes. Thus, the classes 
  677 taken by those faculty members are to be assigned to some other faculty 
  678 members.
  680 Facility of keeping track of back log periods due to absence or 
  681 unavailability are to be recorded year and group wise in the software. 
  682 Also extra periods taken by the faculty has to be recorded year and group 
  683 wise.
  685 43---------------------------------------------------------
  686 From ßingen:
  688 For the internal organization of my school, it's convenient to have a general timetable for each
  689 group, A and B, and our timetabling software gives it. But as you observed, the footnote legend
  690 style it's not probably the best, as it's a little bit difficult to understand. I think in FET a good
  691 solution could be to be able to define a group of activities for a group (for example A, or even the whole
  692 year A and B), and then subdivide this group of activities in many subactivities, each of them
  693 with its own teacher and classroom (I have read the term "subactivity" in the manual, but I
  694 can't find a definition of it, nor find it in FET menus). So a group would be attending many
  695 activities at a time, which is not possible right now in FET. Maybe if it represents a structural
  696 problem FET could define internally subgroups, but being transparent for the user. This activity
  697 group should have a user defined name to identify (for example "Optative 1"). And then inside,
  698 each subactivity would have the real subject ("French language", "Arts", etc.). In this way the
  699 user would avoid to define such a great number of subgoups, and in the teacher's timetable
  700 everything would appear right and clear, with no reference to the activity group, just to his own
  701 subactivity, and with information of room besides of the group (opposed to the pseudoactivity
  702 solution to book the room).
  704 In the group timetable, the common activities would appear as always, and the others would appear
  705 with the activity group name. Then parallel timetables with blanks in the common activities and
  706 one of the subactivities for the rest could be printed . So we would need as much timetables as
  707 the maximum number of subactivities of the largest activity group. Maybe the subactivities could
  708 be diplayed in couples to avoid many timetables, as it happens now with group timetables and
  709 "same day+hour" activities.
  711 These parallel timetables could be hanged up on the classroom board, and, of course, each pupil
  712 should know which of the subactivities has to attend. I think this display should be clearer than
  713 the footnote legend style. I don't know if I have explained it clear enough, but if not I could
  714 send a spreadsheet with an example.
  716 Also, with this solution, if no activity group are defined all works as before, so we would avoid
  717 the problem commented by Liviu of people not needing it.
  719 44-------DONE since FET-5.19.0-(10 January 2013)-----------
  721 45---------------------------------------------------------
  722 From Massimo Mancini:
  724 SUGGESTION BY: Massimo Mancini
  726 WHERE: add activity form
  728 WHAT: a check box to lock the total duration of activity
  730 WHY: to introduce an automatic check and alert on the sum of durations of
  731 single subactivities (currently the total duration reflect always the sum,
  732 so if you alter the single duration, FET recompute the total, this can be
  733 what you want or maybe not)
  735 WHEN: all new future are always ASAP :-D (the programmer says...)
  737 FURTHER DEVELOPMENTS: a templates system for automatic generation of activity based
  738 on year and subjects expected for a class of that year (normal italian
  739 situation, abroad I don't know ;-)
  741 46---------------------------------------------------------
  742 From ßingen:
  744 - 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.
  745 I 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
  746 of the teachers in this slot. There must be always 2 teachers looking after the pupils during this period, so I define activities without students.
  747 The 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"
  748 then I can not define the surveillance activities.
  749 - 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".
  750 But 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.
  752 47---------------------------------------------------------
  753 From T. Renganathan:
  755 You can include a provision for multiple selection of subjects, teachers,
  756 activities, etc., for example using Ctrl or Shift key. This will especially be useful for deleting
  757 multiple entries.
  759 48---------------------------------------------------------
  760 From Volker Dirr:
  762 Volker:
  763 if i am in FET->Data->Subjects
  764 i can't see at the right side all constraints.
  766 in my latest samplefiles for example the "a set of subactivities has a
  767 set
  768 of preferd time slots" is missing to that subject.
  770 also in FET->Data->Activity Tags are not all constraints displayed.
  772 Liviu:
  773 Yes, I know, because these are related to activities. I chose not to show them.
  775 Volker:
  776 please add in TODO. i think this is a nice feature we should not forgot.
  778 Liviu:
  779 I thought about your proposal. I think it cannot be done and I know the reasons why I didn't do that: 
  780 a constraint activities preferred starting times has subject "" or specified. If it is "", then it is for 
  781 all subjects. So, I should write all constraints of this type with subject "" for each subject. But this 
  782 is not correct. A constraint might have a teacher who doesn't have this subject.
  784 49---------------------------------------------------------
  785 From Volker Dirr:
  787 by the way we should add a new tests before generating a timetable:
  788 if 2 activities are grouped, then turn of min n day constraint of that
  789 activities.
  790 if 2 activities are consecutive, turn of min n day.
  791 if 2 activitives have same starting time, turn of min n day.
  793 or the opposite, bedending on what has a higher weight.
  795 maybe instead of turning of maybe just warn the user that this two
  796 constraints are not acceptable at the same time and tell him he should
  797 care about that problem first of all (by removing or reducing weight to
  798 0%).
  800 50---------------------------------------------------------
  801 From Les W. Johnstone:
  803 Hi Liviu,
  805 I'm into the thick of it again scheduling...
  806 now working on two different schools...
  808 Sacred Heart College is not a problem since they use a five day blocked
  809 schedule. Saint John's College though is a slightly different problem...
  811 They have a five day AB schedule...
  813 which means I entered two activity groups... one for week one and one for
  814 week two and used different activity tags... w1 and w2 to keep things
  815 separate, with specific rules of placement of w1 in Week1 and w2 in week
  816 2...
  818 However, your spacing feature doesn't work ... not on more than five
  819 days.... not sure it would be possible to extend your logic or not... (what
  820 do you think?)
  822 The other thing I've noticed is a bit of an annoyance concerning
  823 constraints... when you are trying to get a schedule to work you push in
  824 constraints however, on slight modification of activities (concerning
  825 resources etc.) sometimes, what was once soluble becomes insoluble.
  827 Usually this means you have to relax constraints in order to get the
  828 schedule soluble... some (most) can be set to a 0% weight which means they
  829 are ineffective.. then later you can turn them on again... however, some
  830 rules are only acceptable at 100%... which means you need to drop them from
  831 the constraint set...
  833 but the constraint may be important and be forgotten to reimplement...
  834 could you set an active/inactive flag for constraints like you have for
  835 activities... so it can later be reimplemented?
  837 51---------------------------------------------------------
  838 From Chafik Graiguer:
  840 Liviu:
  841 There is no easy way to remove a component.
  843 Chafik Graiguer:
  844 well
  845 to re-use  last year .fet file,
  846 what about
  847 -removing all activities at once, so Data keeps only subjects, teachers and groups ?
  848 or
  849 - removing all teachers from all activities (because teachers dont teach the same groups every year)
  850 or
  851 - removing all groups from all activities
  853 Liviu:
  854 I just looked in the sources and it seems that in statistics I only count active activities. Please verify that, though.
  856 Chafik Graiguer:
  857 yes !
  858 and I spend nealy ONE hour counting periods for teacher  Eng1!!
  859 in Statistics, teacher  Eng1 has only 20 hours
  860 in Data  ---> activities, I count 21 hours :-))  for him
  861 finaly, I realised that I has deactivted one hour component by mistake
  863 so, is it possible to add this line into activity window:
  864 Quote:
  865 Activity:
  866 Teacher=fr4
  867 Subject=fr
  868 Students=2Lg -1
  869 Id=1
  870 Activity group id=1
  871 Duration=1
  872 Total duration=5
  873 Total active: XX
  874 Active: yes
  875 Total number of students=0 
  877 -----------addition:
  878 Chafik Graiguer:
  879 - removing all groups from all activities
  880 sorry, removing groups does not make sense, because, activities should keep group's information
  881 Groups have the same set of activities every year
  883 So the most important is:
  884 -removing all activities at once, so Data keeps only subjects, teachers and groups ?
  885 but this is not so good, as we will lost time and space constraints related to those activities
  886 So, the best of the best is:
  887 - removing all teachers from all activities (because teachers don't teach the same groups every year)
  888 so we can re-assign new teachers to groups
  890 52---------------------------------------------------------
  891 From Massimo Mancini:
  893 Consider this:
  894 1. I inspect the activities of a teacher (via filter on teacher)
  895 2. I see the lack of an activity (or I delete one or more filtered
  896 activities because I want redefine them)
  897 3. I push the add buttom... why the subjects aren't
  898 only those that teacher teach?
  900 A more general question... why not associate in advance the teacher with
  901 his students and with the subject he teaches? In this way I could obtain some
  902 type of automatic filter.
  903 If I add an activities of mines I select MANC but MANC teach MAT in GEO_1B,
  904 GEO_2B, GEO_3B and IGE_1A. The program should be aware of this.
  906 53---------------------------------------------------------
  907 From Massimo Mancini:
  909 When I review generated timetable with view (teachers) menu option I can lock/unlock
  910 the placed activities and this is ok. But why I cannot do the same for
  911 empty cell? The meaning of locking an empty cell should be to add/modify a
  912 Teacher not available constraint or something that have the
  913 same effect... so a new generation leaves those positions untouched.
  915 A I said I would to lock/unlock some students or some teacher and
  916 recalculate the rest.
  918 54---------------------------------------------------------
  919 From Frans Cilliers:
  921 About campuses: What I thought is the following. Currently you have min
  922 gaps between buildings and maximum building changes per day. If this can
  923 also be done for campuses, for example minimum gaps between campuses for
  924 teachers. (An extra constraint but it will probably be to difficult as
  925 you mentioned)
  927 55---------------------------------------------------------
  928 From K:
  930 Maybe you remember my post from April (many teachers – many groups). Since
  931 than in our team we’ve been trying to adapt our internal solutions to use
  932 FET (it is really your great success).
  933 We tried to use FET to solve timetable for a pretty big plan and by the
  934 way we had to solve a few problems and got some experiences as an
  935 end-users. Maybe it would be interesting also for you.
  936 ...
  937     The third problem was to export data from the program we use for planning
  938 (a database application) to FET and than import data back. I pre-assumed I must
  939 enter data to the FET automatically as the number of activities and
  940 constraints is too high to handle them manually. Also a plan generated by
  941 FET had to be automatically imported to our database. I used FET
  942 procedures to import teachers, students and rooms. I also tried to use
  943 FET import procedure for activities too but I had a problem with IDs. FET
  944 generate its own ids but I needed to use my own ones to keep link between
  945 data in the database with those in the FET so finally I decided to
  946 generate input file instead. Fortunately FET doesn’t change ids and
  947 generate perfect XML file with generated plan and
  948 thanks to known ids I could import data from FET to our database with no
  949 problem.
  950     The next point. Due to number of constraints we have in our database I
  951 used similar procedure to generate a part of FET input file with teacher
  952 time constraints and room time constraints. Hence I have a question.
  953 Would it be possible to include file path into FET input file to keep
  954 data in a couple of separate files as working with 100 000 lines file is
  955 not fun?
  956     We prepared the whole procedure for timetabling with FET. First we
  957 planned (in the database program) activities for VIPs manually. To use FET
  958 we also had to put into the timetable all activities where students from
  959 one group could choose one activity from a several ones (languages and
  960 some lectures) at the same time. That is why in the input files are so
  961 many “permanently locked” activities and activities with many groups and
  962 only 10 students to avoid conflicts with room capability (I used
  963 <Activity_Tag>UL to mark them). Together with these activities we locked
  964 a room by preferred_room constraint. After that I included prepared data
  965 to the FET input file and after all we started to generate
  966 the plan. Fortunately FET is smart enough to find mistakes in locked
  967 activities (room and time conflicts) so than we removed conflicts for
  968 already planned activities.
  969     By the way – during reading the input file I noticed the error
  970 that rises when the number between tags:
  971 <Number_of_Not_Available_Times>NUMBER</Number_of_Not_Available_Times>
  972 was  not exactly the same as the number of constraints in the file. Of
  973 course it is not a bug. It never happens if user use FET to input
  974 constraints. But it forced me to count constraints during generating data
  975 and shows that program is rather “sensitive”.
  976 The first hint for other users is to start with minimum number of
  977 constraints and if FET would generate the plan than thinking about adding
  978 the next ones. In TODO file I found the suggestion of “possibility to
  979 disable constraint without removing it. Such 'Active' checkbox like on
  980 activities dialog”. I admit – it would be nice. Moreover finding a good
  981 plan is just like using 10 knobs increasing one constraint and decreasing
  982 the other so fast access to the constraints window is crucial. I suggest
  983 to put “Time constraints” and “Room constraints” buttons also in the main
  984 menu (or creating any other shortcuts) as these constraints are rather
  985 deep in the menu.
  986 The next suggestion is to change the interface for some constraints
  987 (particularly wherever there is a long list). For instance for the
  988 constraint Max day for a teacher per week if we have many teachers a
  989 simple table like:
  991 | Teacher Name | Max days|
  992 | teacher 1    |     n   |
  993 | teacher n    |         |
  995 with a button “Save all changes” would be great. Now we have to enter
  996 value for every teacher one by one in separate windows.
  997     After setting constraints we tried to generate the next version of the
  998 plan. We added more and more constraints (for instance WOLNE – dump
  999 activities - free day for student or increasing max day for teacher) and
 1000 I was really surprised when FET coped with that. It took from about 1,5
 1001 minutes (almost no constraint) to over 20 minutes (with many constraints).
 1002 With too many constrains after
 1003 about 10 minutes when I saw no change in the number of placed activities
 1004 (neither up nor down) I cut simulation, removed some constraints and
 1005 started it over.
 1006     The second hint is not to change too many constraints in one simulation
 1007 as it may lead to impossible timetable and than it is difficult to say
 1008 which particular constraint was too much.
 1009     Of course there is a lot of work to do. For instance even when two
 1010 consecutive activities are placed at one day (the same group and the same
 1011 teacher) sometimes there are placed at different rooms what would force
 1012 them to needless changing room. I guess that FET is focused on fulfilling
 1013 constrains but not on optimizing timetable. Sometimes simple changing of
 1014 two activities makes plan better both for students and teachers. I think
 1015 that manually improving generated plan is faster than creating many many
 1016 more constraints and repeating simulations. And this is the third hint.
 1018 56---------------------------------------------------------
 1019 From Chafik Graiguer:
 1021 When a user click on Data ---> activities
 1022 he is presented with a list of all activities because filter fields are empty
 1023 all activities are listed based on Activity Id
 1024 Now, is it possible to a add sort feature like this
 1025 Sort by:
 1026 	Teachers
 1027 	Students
 1028 	Duration
 1029 	Subject
 1030 	Act Id
 1032 So for example, if you select teachers, all activities will be listed alphapetically in a ascendent order
 1034 57---------------------------------------------------------
 1035 From Massimo Mancini:
 1037 In advanced lock/unlock I would lock/unlock on teachers basis (with pick up
 1038 the teacher from list of teachers) or on students groups basis (always from
 1039 a list) The lists are mentained from subsequent generations and saved with
 1040 data.
 1042 58---------------------------------------------------------
 1043 (see also items #149, #368, and #396)
 1044 From Massimo Mancini:
 1046 I have another suggestion: an history file where you record all the actions
 1047 of the timetabler and theirs effects. If the history was visible in a a frame
 1048 in the View timetable forms, I would see scroll the messages without interruption
 1049 and with the opportunity to review them (please don't answer that is too
 1050 complicated... you can use a tab widget, a tab for the current situation
 1051 another for history... the right answer is: GREAT! I add it in TODO! ;-))).
 1052 In general an history file should be a great thing and the base for
 1053 undo/rollup features.
 1055 59---------------------------------------------------------
 1056 From George Milliotis:
 1058 I propose the ability to sort constraints by:
 1059 1. Type [so single ones - ones that you can't add twice - go to the top]
 1060 2. ID of activity
 1061 3. room / day
 1062 and so on
 1064 This could also be done for activities. If I add two activities for the
 1065 same subject, why do I need to have one at the bottom (id 200) and the
 1066 other at the top (id 5)?
 1068 BTW, I haven't used the menu once since I got this new version. I like
 1069 the basic concept of the shortcuts. If the dialogs were not modal I'd be
 1070 opening all sorts of windows and working much faster. If I could HIDE
 1071 buttons selectively I'd even be able to get the secretaries to do the
 1072 schedule and save ALL my time.
 1074 60--------------------------------------------------------
 1075 From Frans:
 1077 I refer to the Data menu, space constraints and say students, set of home rooms and then add.
 1078 In this box I select the students and then the individual venues.
 1080 If I for example already defined an activity tag for Large rooms, I want to add the activity tag
 1081 instead of the individual venues.
 1083 Now that I think again I doubt if it will be possible, because FET has to make a distiction between
 1084 general activity tags and "room" activity tags as the room activity tags must also appear in the rooms
 1085 list so that it can be selected. How will FET know this.
 1087 61--------------------------------------------------------
 1088 From Volker Dirr:
 1090 an other useful feature is:
 1091 modifying in settings the default min days constraint (for add activity).
 1093 because we nearly always use 100%, not 95%.
 1095 modifing later all to 100% isn't the best, because there are a few
 1096 activities with min days = 0%.
 1098 62------------------------DONE-----------------------------
 1100 63-----------------------DONE------------------------------
 1102 64---------------------------------------------------------
 1103 From aliponte:
 1105 An activity tag can be assigned the property not to count the underlying activities.
 1107 Please 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 
 1108 activity of a day). A pseudo activity should be "invisible" for all countings concerning constraints, and for countings concerning statistics (teachers, students, subjects).
 1110 65---------------------------------------------------------
 1111 From aliponte:
 1113 There 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.
 1115 Dialog "Modify activity":
 1116 Changing 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.)
 1118 Since 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).
 1120 By 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.
 1122 66---------------------------------------------------------
 1123 From Chafik Graiguer and Pietro (see also items #145 and #248):
 1125 DONE 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
 1126 -Min hours continuously with an activity tag
 1128 67---------------------------------------------------------
 1129 From Gert Veltink:
 1131 I 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.
 1133 Rationale: 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.
 1135 68---------------------------------------------------------
 1136 From Mr Robo:
 1138 In 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
 1139 morning breaks and lunch breaks combined.
 1141 If 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
 1142 finished timetable, such as 'Break' or 'Lunch', it would save me having to edit each Student, Teacher and Room timetable before they
 1143 can 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.
 1145 Also suggested by S Chandrasekar, on forum:
 1147 It is important to display a text like "LUNCH INTERVAL" or "SHORT INTERVAL" or "ASSEMBLY" in the break slots rather than an
 1148 "-X-" symbol. Is it possible?
 1150 Also suggested by Nagendra, on forum:
 1152 You can consider including this in settings -> timetables -> "Mark break slots with custom text". Let the user decide, whether s/he wants
 1153 to use the default '-X-' or any custom text. Similarly for 'uniting' the cells.
 1155 69---------------------------------------------------------
 1156 From George Miliotis:
 1158 About the "Years", "Groups", "Subgroups" check boxes in add/modify activity and
 1159 modify subactivity dialogs:
 1161 I'd be more interested in FET actually remembering these settings
 1162 globally (not even per form) for each session, no need to actually store
 1163 to disk.
 1165 70---------------------------------------------------------
 1166 From Frans (on forum):
 1168 Frans:
 1170 I came across the following, it is possible that you know about this:
 1172 I generate a timetable with constraints such as minimum hours daily for a students set
 1174 Next from the data, students, groups or subgroup menu I deactivate all activities for one group. This group has the constraint minimum hours.
 1176 I generate again and then Fet- gives an error message and stops, namely you have too little activities to respect the constraint minimum hours ....
 1178 In other words I must go to minimum hours and delete the constraint. It is not deactivated automatically.
 1180 As said I do not know if it must be like this. Other constraints such as same starting time are automatically de-activated.
 1182 Liviu:
 1184 It 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.
 1186 Frans:
 1188 I 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.
 1190 Studens 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.
 1192 If it was possible to deactivate everything only when one uses the data menu.
 1194 Liviu:
 1196 Yes, 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.
 1198 For 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.
 1200 The perfect approach might be to add a flag to each teacher, subject, activity tag, students set -> active or not active.
 1201 It would be kind of tedious and difficult to change now, as it was not designed from the beginning.
 1203 71---------------------------------------------------------
 1204 From Jason (on guestbook):
 1206 Ask for new feature:
 1208 - Auto generated after allow user to manual adjust timetable (Drag and Drop in view timetable)
 1210 72---------------------------------------------------------
 1211 From Zsolt Udvari (on forum):
 1213 If I de-activity all activities of a whole year (student set), FET will not ignore "min hours daily" constraint.
 1214 So I've two suggestion immedi:
 1215 - when FET checks this (and similar) constraints, would tolerate this
 1216 - can deactivate the students set (and related activities, constraints, etc.)
 1218 73---------------------------------------------------------
 1219 From Zsolt Udvari (on forum):
 1221 It would be nice when can filter in activities list by "no teacher" and "no students".
 1223 74---------------------------DONE--------------------------
 1225 75---------------------------------------------------------
 1226 From Chafik Graiguer (on forum):
 1228 Clone activities or constraints:
 1230 Is it possible to clone activities for one student set to another?
 1231 Last year, Year 1S had 3 student sets
 1232 Now Two new student sets have been added
 1233 Student sets from same year have same activities and of course same time constraints
 1234 So how it is possible to do an activities Clone from 1S03 to both 1S04 and 1S05 with or without assigned teachers ? 
 1236 76---------------------------------------------------------
 1237 From Zsolt Udvari (on forum):
 1239 Default settings per subject:
 1241 Is 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).
 1243 77---------------------------------------------------------
 1244 From Chafik Graiguer (on forum):
 1246 Save button on Activity Planing Window:
 1248 For users working with activity planning window, they will probably spend most of the time on it
 1249 But 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
 1250 Can a save button be added to activity planning window?
 1252 78---------------------------------------------------------
 1253 From Chafik Graiguer (on forum):
 1255 About constraint min gaps between a set of activities:
 1257 Now, 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?
 1258 Entering all activities, one by one is tedious
 1259 How it is easy/possible to add: min gaps between a set of activites with a tag?
 1261 or better:
 1262 Min gaps between two subjects/tag
 1264 79---------------------------------------------------------
 1265 From Chafik Graiguer (on forum):
 1267 Filter for modify multiple constraints at once:
 1269 In the min days between activities window
 1270 there is an option for: Modify multiple constraints at once
 1271 Is it possible to add a standard filter: teacher, student set, subject, tag ?
 1272 So I can multi-change only those activities with a given subject or teacher... etc?
 1274 80---------------------------------------------------------
 1275 From Chafik Graiguer (on forum):
 1277 Filter teachers:
 1279 Students are easily filtered because they are grouped using years then groups
 1280 So at Students set not available time window, we can, for example, apply unvailability to only one year, thus affecting  groups under that year
 1281 We can also apply unvailability to group, thus affecting  Subgroups under that group.
 1283 Unfortunately , teachers are treated either individually or totally (constraints for ALL teachers): ONE or ALL
 1284 Zsolt Udvari already wrote:
 1285 Quote:
 1286 It would be nice when can pair teachers with his/her subjects and can filter in the activity dialog.
 1287 So, 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.
 1289 So it would be very practical, less time consuming, to treat teachers per groups based on
 1290 - Home subject
 1291 or
 1292 - any other artificial tag like :
 1293 -part_time_teachers,
 1294 - team teachers,
 1295 -..etc
 1297 81----------------------------DONE-------------------------
 1299 82---------------------------------------------------------
 1300 From Valdo (on forum):
 1302 Conclusion: he has many teachers, and almost all should have max 2 gaps per week, with 2 exceptions, who may have more gaps. He
 1303 does not want to add manually that many constraints. So, he suggests that FET should add constraints for all teachers,
 1304 with a selected number of max gaps per week, and then the user can modify each one by hand.
 1306 (Suggested indirectly also by Julio González Gil, on the forum.)
 1308 Added 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
 1309 a single teacher. There were too many constraints to add.
 1311 Suggested also by utismetis, on the forum, on 2017-08-07.
 1313 Suggested also by Davide Cottignoli, on the forum, on 2017-08-18.
 1315 Suggested also by mercurialuser, on the forum, on 2017-09-05.
 1317 Suggested also by auriolar and rodolforg, on the forum, on 2018-04-15 (they suggest to add exceptions to the general constraint).
 1318 rodolforg: I don't think it needs to change the constraint names. Just add the 'exception' field.
 1320 Suggested also by pg788, on the forum, on 2018-07-02
 1322 Suggested also by satellite2, on the forum, on 19 December 2018 (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0):
 1323 	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)".
 1324 I 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
 1325 course 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"
 1326 or "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
 1327 lots of teachers in the university).
 1329 Suggested also by Zafar Allah Askar (on forum), on 26 October 2019 (https://lalescu.ro/liviu/fet/forum/index.php?topic=4313.0):
 1330 	Create lists of teachers to be added to a constraint.
 1332 See also TODO item #84.
 1334 83---------------------------------------------------------
 1335 From Massimo Mancini:
 1337 1. Constraint not available time slots for a teacher
 1338 2. I put a name in filter and I see there's any constraint of this kind on
 1339 that teacher
 1340 3. Then I press Add. I expect the teacher field filled with the name I used in
 1341 filter... but currently FET propose always the first teacher in list.
 1343 84---------------------------------------------------------
 1344 From Massimo Mancini and Chafik Graiguer:
 1346 Consider this:
 1348 1. the max num of hours for day is 5 for ALL teachers, the max num for teacher X is 3: this
 1349 works
 1351 2. the max num of hours for day is 4 for ALL teachers, the max num for teacher X is 5: this
 1352 NOT works as expected. FET simply refuse the exception. The exception does
 1353 not override the global in any case.
 1355 I remember we discussed this "strange" logic (imho an exception is an
 1356 exception and always override a global condition) last year, it seems that
 1357 the workaround is to manage this scenario using only individual constraints
 1358 (isn't it?), very tedious. If so I suggest a button in the form of global
 1359 constraint to automatically generate all the individual constraints one
 1360 needs.
 1362 From Chafik Graiguer (same subject):
 1364 My suggestion was not only about adding a teacher one by one
 1365 It is about get rid of double menu entries
 1366 For example, for Teachers and students, and for every constaint, FET has double entry like this:
 1367 -Max days per week for a teacher
 1368 -Max days per week for all teachers
 1369 -Min days per week for a teacher
 1370 -Main days per week for all teachers
 1371 ...etc
 1372 My idea is to make a single entry for any constraint like this :
 1373 -Max days per week for teacher (s)
 1375 -Min days per week for teacher (s)
 1377 This has another advantage:
 1378 user will be presented by a window like described in my screenshot, where he can press Add all button
 1379 Now suppose, like user X, that I have 50 teachers or 50 student sets
 1380 I can easily add them all into Min days per week =5
 1381 then on the right pan double click on 5 teachers to deselect them before clicking Add constraint
 1382 Then add another Min days per week =3 for those 5 teachers !!
 1383 If we have tags for teachers (and rooms) it will even more easier
 1385 This concept is already used in FET in two places:
 1386 - Set all available, set all not available
 1387 - subject has a set of prefered rooms
 1389 See also TODO item #82.
 1391 85---------------------------------------------------------
 1392 From Massimo Mancini:
 1394 Consider the form that lists the constraint "teacher non available":
 1395 change the line format from DESC CONSTRAINT + TEACHER'S NAME to
 1396 TEACHER+CONSTRAINT or, better, codify description of constraint using some string of
 1397 fixed size like so:
 1399 HTNA - NAME .....
 1401 I know the problem of translation (you may omit the description at all, it is
 1402 useful only when you display ALL constraints), but I think that a code is less boring
 1403 than a long and incomplete description repeated at beginning of all lines.
 1405 86---------------------------------------------------------
 1406 From Andres Chandia (on forum):
 1408 Is 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
 1409 teacher of certain group, etc.
 1411 87---------------------------------------------------------
 1412 From Massimo Mancini:
 1414 a problem that we discussed in the past is about the description of
 1415 constraints (specially in the list of constraints or in the list of
 1416 conflicts): they are too long.
 1417 You must well understand that the unlucky timetable maker need to see the
 1418 troubles at a glance: reading long sentences with absolutely redundant
 1419 parts is very difficult and time consuming.
 1420 This is a problem in english but the solution can be achieved also and only in
 1421 translations... (a buon intenditor...;-)
 1423 So in the following you will find an example of that I think is a good list.
 1424 Of course is only my opinion. But, trust me, is a useful one
 1426 ----- NOW --------------------------------------------------
 1428 Conflitti lievi totali: 13.7
 1429 Elenco dei conflitti leggeri (in ordine decrescente):
 1430 Vincolo 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
 1431 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante DIRU il giorno Mercoledì durata=5.  Questo incrementa la conflittualità di 0.99
 1432 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante GADO il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
 1433 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante MALG il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
 1434 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante MESS il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
 1435 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante OSIO il giorno Lunedì durata=5.  Questo incrementa la conflittualità di 0.99
 1436 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante POLE il giorno Venerdì durata=5.  Questo incrementa la conflittualità di 0.99
 1437 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante PULI il giorno Mercoledì durata=5.  Questo incrementa la conflittualità di 0.99
 1438 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante RAPE il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
 1439 Vincolo di tempo numero massimo 4 ore consecutive infranto per l'insegnante xAZ1 il giorno Sabato durata=5.  Questo incrementa la conflittualità di 0.99
 1440 Vincolo 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
 1441 Vincolo 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
 1442 Vincolo 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
 1443 Vincolo 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
 1445 ----TOMORROW I HOPE ()IMHO)-------------------------------------------------
 1447 Conflitti lievi totali: 13.7
 1448 Elenco dei conflitti leggeri (in ordine decrescente):
 1449 VT: 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
 1450 VT: Num.max. 4 h consec. :  DIRU : Mer : 5 : +0.99
 1451 VT: Num.max. 4 h consec. :  GADO : Sab : 5 : +0.99
 1452 VT: Num.max. 4 h consec. :  MALG : Sab : 5 : +0.99
 1453 VT: Num.max. 4 h consec. :  MESS : Sab : 5 : +0.99
 1454 VT: Num.max. 4 h consec. :  OSIO : Lun : 5 : +0.99
 1455 VT: Num.max. 4 h consec. :  POLE : Ven : 5 : +0.99
 1456 VT: Num.max. 4 h consec. :  PULI : Mer : 5 : +0.99
 1457 VT: Num.max. 4 h consec. :  RAPE : Sab : 5 : +0.99
 1458 VT: Num.max. 4 h consec. :  xAZ1 : Sab : 5 : +0.99
 1459 VT: 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
 1460 VT: 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
 1461 VT: 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
 1462 VT: 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
 1464 88---------------------------------------------------------
 1465 From Volker Dirr:
 1467 students set max gaps per week
 1468 and
 1469 students set begins early
 1471 need a filter/checkbox show only O year O group O subgroup
 1472 because there are so many students (subgroups) and it is useful to add
 1473 that counstraints for lower years. but the list is so long, so it is very
 1474 difficult to find the years.
 1476 that filter is also useful for students set not available.
 1478 89---------------------------------------------------------
 1479 From Paolo (on forum):
 1481 Well, for me it would be very very (very) important thinking over the constraints while fet is working.
 1483 So i ask, kindly, if it is possible getting a print function of all constraints (at least of time constraints).
 1485 Liviu: A temporary solution would be to open two FET programs simultaneously.
 1487 90---------------------------------------------------------
 1488 From daviodan:
 1490 Possibility to edit the timetable after generation, drag-drop of activities.
 1492 91---------------------------------------------------------
 1493 From Yush Yuen:
 1495 Sometimes we have 3 teachers available to teach the same "kind" of
 1496 class. For example, Teacher A, B C may teach either one of Math for
 1497 7A, 7B, and 7C. It is possible that one combination may yield a
 1498 timetable that is easier than another. So, it would be nice if we can
 1499 have an option to generate "alternative" scenarios with the different
 1500 combination.
 1502 A possible way to do that may be:
 1503 - adding a "teachers-activities pool" dialogue.
 1504 - activities of the same pool may swap teacher
 1505 - each pool may be enabled or disabled at timetable generating time
 1506 (you may not need all combination all the time)
 1507 - all generation time, make an option for "generating alternatives"
 1508 and save each alternative in a different folder or something
 1510 Or:
 1511 - activities are created without teachers
 1512 - adding a "teacher can teach: activity tag" dialogue
 1513 - at generation time, teachers are assigned to activities based on
 1514 which teacher has the right "teacher can teach tag"
 1516 Or, another way of doing this (perhaps a more elegant way) is to make
 1517 a "preferred teacher" constraint like the preferred room constraint.
 1518 However, also add an "same room/teacher" option. That is, room/teacher
 1519 may be selected from list of preferred rooms/teachers, however, the
 1520 same room/teachers must be assigned to the same activities.
 1522 92---------------------------------------------------------
 1523 From Silver (on forum):
 1525 Constraint "Min gaps between activities in the day for teacher".
 1526 I mean like this :
 1527 when I select Min gaps = 2
 1528 Saturday: activity - gap - gap - activity - gap - gap - activity
 1530 93---------------------------------------------------------
 1531 From George Miliotis (on forum):
 1533 I 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.
 1535 An advanced option: "renumber activities" with a dialog asking for "new lowest ID" would be ideal for these merge-split issues.
 1537 In this case we could renumber the first FET file from 1, the second from 1000, then copy paste directly into the XML file.
 1539 This would get all rules and activities, wouldn't it?
 1541 But maybe we could use XSL for this.
 1543 94---------------------------------------------------------
 1544 From aang (on forum):
 1546 I 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
 1547 making 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,
 1549 instead 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
 1550 tag to the activity which defaults to the current display name (without the activityID) and using this to determine what is displayed for the activity.
 1552 Another 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
 1553 of days or lessons (depending on the selected timetable)? This way it is easier to print.
 1555 95--------------------------DONE---------------------------
 1557 96--------------------------DONE---------------------------
 1559 97---------------------------------------------------------
 1560 From liquid (on forum):
 1562 Based 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.
 1564 Liviu: 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.
 1566 liquid: 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. 
 1568 Update: The maximum number of categories now is 4.
 1570 98------------------------DONE-----------------------------
 1572 99-------------------------DONE----------------------------
 1574 100---------------------------------------------------------
 1575 From Chafik Graiguer (on forum):
 1577 I spent much time striving to solve an impossible timetable
 1578 I wonder if FET can automatically report it impossible then abort
 1579 -First case: a teacher having only 5 hours per week: 1+1+1+2 (Min days between activities=1)
 1580 With Min hours per day for teachers = 2
 1581 This lead for an impossible timetable, but FET desperately trying to solve it for hours and hours
 1583 -Second case:
 1584 A teacher has 15 hours
 1586 With 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)
 1587 But activities were split in a rather strange fashion
 1588 Group G1: 3+3
 1589 Group G2: 2+2+2+3 (Min days between activities = 1)
 1590 Activities from G1 alone would occupy him for 2 days
 1591 Then come activities form G2 which require additional 4 days
 1592 Total is 6 days !!
 1593 I set Max days per week = 5
 1594 This leads to yet another impossible timetable
 1596 My question: can FET automatically report it impossible then abort?
 1598 101---------------------------------------------------------
 1599 From drew:
 1601 Actually 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.
 1603 After 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.
 1605 I'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.
 1607 The 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.
 1609 You do similar checking for student groups which have too many activities for the available time slots 
 1611 102---------------------------------------------------------
 1612 From Christian Kemmer:
 1614 I have another suggestion which would make things easier for me.
 1615 When 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.
 1616 What 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.
 1618 My suggestion is that there is a checkbox "show subgroups of group" with the following effect:
 1619 If I choose a group and activate that checkbox, all subgroups of that group are also shown.
 1620 So 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.
 1621 If 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.
 1623 103---------------------------------------------------------
 1624 From Silver (on forum):
 1626 He needs a constraint to ensure that all activities of each teacher are hosted in different rooms (for exam scheduling).
 1628 104---------------------------------------------------------
 1629 From Davide G. M. Salvetti (on forum):
 1631 Would it be possible to sort on comments the activities list (like sorting the constraints)?
 1633 105---------------------------------------------------------
 1634 From Davide G. M. Salvetti (on forum):
 1636 I 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
 1637 _data_and_timetable.fet, where each activity is (non permanently) blocked in time and space) even when FET gets interrupted, rather than only
 1638 if it completes succesfully.  I think it could be useful, because that file could then be reused as a start, maybe manually deleting or adding
 1639 some constraint.
 1641 106---------------------------------------------------------
 1642 From Silver (on forum):
 1644 He needs "teachers_rooms.html" in the statistics folder, he thinks it would be useful for the examination timetable.
 1646 107---------------------------------------------------------
 1647 From Horatiu Halmajan and Yush Yuen:
 1649 They suggest the possibility of selecting more constraints in the all time/space constraints dialogs and
 1650 de(activate)/remove them in a single operation.
 1652 108---------------------------------------------------------
 1653 From skinkone (on forum):
 1655 What 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
 1656 complexity exponentially. However, if you are thinking of going down this road in future developments, I would vote in favor of having such a
 1657 feature where students can have "tag preferences". The user would set "minimum or maximum number of tags a student group must have". This would
 1658 then be an optimization problem to try to get the most students with their preferences. Essentially FET would form student groups as an output
 1659 rather than as an input.
 1661 109---------------------------------------------------------
 1662 From Jonathan Block (on forum):
 1664 It would be nice to have a fourth dimension.
 1666 Explanation from Liviu Lalescu: He considers students (1), teachers (2) and rooms (3) as three dimensions. He would like to allocate activities
 1667 to teachers (4) (and these teachers should be the fourth dimension, different in concept from the second dimension, but similar to the third dimension).
 1669 110---------------------------------------------------------
 1670 From Liviu Lalescu:
 1672 Possibility (check box, default checked) of safe saving for File/Save and Save as. Maybe even for Timetable/Save data and timetable as.
 1674 Safe 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.
 1676 111-------DONE since FET-5.35.0-(21 December 2017)----------
 1678 112---------------------------------------------------------
 1679 From murad:
 1681 Create please, in QComboBox, auto-complete. With a large number of students and teachers it is very difficult to find the necessary students or teachers.
 1683 113---------------------------------------------------------
 1684 From kdrosos:
 1686 In FET there is "School's name", where the school's name appears in the final .html files.
 1688 Maybe the text "School's name" can be parametric and thus to allow changing to "Department's name" or "Institution's name" etc.
 1690 This can also allow a "School's name field" as:
 1692 "Faculty of FET: Department of FET"
 1694 Liviu's note: I think that kdrosos refers to the Greek FET. In the English FET, the string is "Institution name".
 1696 114-------DONE since FET-5.40.0-(20 September 2019)--------
 1698 115---------------------------------------------------------
 1699 From nouvakis:
 1701 I've seen that with html files you save a "xxx_data_and_timetable.fet" file.
 1702 In this xml file, you save
 1703 <Time_Constraints_List> element which contains many <ConstraintActivityPreferredStartingTime>.
 1705 These <ConstraintActivityPreferredStartingTime> elements are the generated timetable data (Activity_Id, Preferred_Day, Preferred_Hour).
 1707 So, 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)
 1709 This file could easily be loaded from a user just to be able to preview the generated timetable inside FET.
 1711 116---------------------------------------------------------
 1712 From nouvakis:
 1714 I would like to suggest an extra optional field to entities of FET program.
 1716 For example:
 1717 Teachers_List: name, [id]
 1718 Students_List: name, [id]
 1719 Subjects_List: name, [id]
 1720 Hours_List: Name, [id]
 1721 Days_List: Name, [id]
 1723 etc
 1725 When someone (like me) would like to import FET generated timetable data to another program,
 1726 there should be a more accurate way to associate an FET entity with my database records beside the name ...
 1728 If you add the id field (as an optional field) there should be no problem to users already using FET ...
 1730 117---------------------------------------------------------
 1731 From mma:
 1733 When 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.
 1735 Removing identical constraints reduces the clutter, and perhaps also speeds up the timetable generation?
 1737 118------------------------DONE-----------------------------
 1739 119---------------------------------------------------------
 1740 From Yush Yuen:
 1742 For printing: It would nice if I can specify a custom css file for the style.
 1744 120---------------------------------------------------------
 1745 From Yush Yuen:
 1747 I find that while the fixed max-room contraint works well, I notice
 1748 something with my situation:
 1750 I have a teacher, teacher A, uses room A and teaches year 6 classes. Unlike
 1751 the more senior years, which are heavily blocked (lots of constraints with
 1752 activities with same start time), year 6 classes are pretty free floating.
 1753 Therefore, the year 6 classes always appear at the end of the order of
 1754 allocation.
 1756 I have included room A as one of the available rooms for the preferred room
 1757 list for another teacher. room A is almost always chosen. But the problem
 1758 is, teacher A and room A become very difficult toward the end of the
 1759 allocation. My timetable has about 1280 activities, and most of the year 6
 1760 classes are toward the end of the list. The generation always got stuck
 1761 toward the end, like 1250, with teacher A not being able to get the right
 1762 allocation.
 1764 I don't think this is a bug. This is easily solved by removing room A from
 1765 the preferredRooms list for that other teacher. But I just want to point
 1766 that out to you.
 1768 Answer Liviu Lalescu:
 1770 I could improve the algorithm to take care of situations like that. So
 1771 it will know that in room A there can be only one type of activity
 1772 (one type of look-ahead). Or that in room A there can be only teacher A
 1773 (another type of look-ahead). But there are contrary reasons:
 1775 1) Will make other timetables slower, by the additional look-ahead.
 1777 2) Each look-ahead is to be avoided, because of possible new critical
 1778 bugs and general slowdown. There are many look-aheads in FET, but they
 1779 are necessary and not very time-consuming.
 1781 3) The user is advised to help FET towards a solution. The user needs
 1782 to collaborate with FET. (Of course, not necessarily us. We want to
 1783 push its limits )
 1785 4) This is the most important reason. Say I solve this problem for a
 1786 single preferred room for teacher A. But this is not everything. A user
 1787 may invent two preferred rooms for teacher A and go into the same
 1788 situation, which now becomes more complicated to manage. I cannot
 1789 forecast all situations similar to yours.
 1791 Please tell me what you think, I might need to treat situation like
 1792 these - I am still thinking. Because I did many look-aheads which are
 1793 necessary.
 1795 121---------------------------------------------------------
 1796 From Andres Chandia:
 1798 He has a custom version, developed by Liviu Lalescu, which among other things
 1799 ensures that if more people open the same file (on a common server), only the first
 1800 one who opened it will be able to save it, and the others will see that their file
 1801 is read-only. He suggests to add this into official FET. But it might be tricky and
 1802 potential bugs might be critical.
 1804 122---------------------------------------------------------
 1805 From Robert Sutcliffe:
 1807 I need to print out all the rules and constraints to document the settings to supply to another system, and for peer review.
 1808 Staff availability, activities, room allocation rules, not-overlapping activity selections - everything!
 1809 Is there any way to do this?
 1810 ---Answer Liviu Lalescu: no, there is no direct way in FET---
 1811 If not, another web report that details all these settings would be ideal.
 1813 123---------------------------------------------------------
 1814 From Zsolt Udvari:
 1816 I 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.
 1817 When I deactivate a year and I want to generate timetable, FET says that some groups don't have enough activities to respect this constraint.
 1819 And when I activate a whole year these constraints will again be activated.
 1821 Answer Liviu Lalescu:
 1823 The best would be other buttons: "Activate/deactivate all constraints for selected students year" and so on, for groups, teachers, etc.
 1824 Because the button says "Activate/deactivate all activities for selected students year" (it refers only to activities).
 1826 124---------------------------------------------------------
 1827 From rjmillett (on guest book):
 1829 there are many things i would like to have in FET:
 1831 1. when adding activities there should be a choice list similar to the new print option now included in 5.18
 1833 to add multiple classes (sub-groups) with the same choice of periods and teacher in one click i.e. all same
 1835 2. 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
 1837 3. 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
 1839 4. print preview choice button on main panel
 1841 5. un/lock buton on main panel
 1843 6. an import and export to EXCEL or txt other than CSV file
 1845 7. print option of teachers statistics on preview not from HTML
 1847 125---------------------------------------------------------
 1848 From Volker Dirr and Bobby Wise:
 1850 Bobby:
 1852 1) I have a situation where a school has 3 Grade 11 classes. 11a, 11b and 11c.
 1854 All the classes have compulsory subjects: 7 Periods of English, 7 periods of
 1855 second language (Afrikaans, French and German) and 8 periods of Mathematics.
 1857 Then each student must select 1 subject from each of the combinations below:
 1860 Combination 1 (6 Periods)
 1862 Accounting
 1864 Biology
 1866 History
 1868 Science
 1871 Combination 2 (6 Periods)
 1873 Art
 1875 Biology
 1877 Economics
 1879 Science
 1882 Combination 3 (6 Periods)
 1884 Art
 1886 Biology
 1888 Geography
 1890 Science
 1893 They also have 2 remaining subjects of 1 period each Life Skills and
 1894 Religious Instruction.
 1897 They have a 7 day cycle and 6 periods in each day.
 1900 Could you please recommend a manner in which I should split the classes in
 1901 order to make it possible for all the subject choices?
 1904 2) Thanks Liviu, Volker did help while you were away so I have sorted out the
 1905 problem.
 1907 What I also discussed with Volker was the possibility of a forth category
 1908 split. I know it will slow down the generation but for me that is not too
 1909 much of a problem. I suggested that perhaps in the Settings Parameters you
 1910 should put an option so the user can decide if they would like a 4th
 1911 category or not. Then obviously they should realize if they do select the
 1912 option that the generation process will be much slower.
 1915 Volker:
 1917 i had several talkings about the number of categories now again.
 1919 what do you think about the following suggestion:
 1921 add in the settings a integer "max number of subgroups for split year
 1922 automaticly".
 1924 by that idea it is much much flexible in the number of categories and
 1925 the number of splits per category.
 1927 so you can increase/change as long as you are not over that limit.
 1929 the current limit is 12*6*6=432.
 1930 i think setting the limit to 500 is ok.
 1932 we maybe also allow the user to increase that limit a bit more, but of
 1933 course only with the warning that it will be slow, produce large html
 1934 files and doesn't make sence if it is (much) greater then "real"
 1935 students per year.
 1937 126---------------------------------------------------------
 1938 From Volker Dirr:
 1940 1)
 1941 >> i just want to tell you this and ask you if we maybe need that also
 1942 >> in FET.
 1943 >>
 1944 >> i am currently coding on an other small tool.
 1945 >>
 1946 >> i saved settings with QSettings and i reload that settings on an other
 1947 >> function.
 1948 >> the strange thing was this:
 1949 >> i saved QSettings in the destructor ~xxx and reload it in an other
 1950 >> function/file again, but it look like Qsettings didn't save. the
 1951 >> strange things was that visible/correct as soon as i restarted that
 1952 >> reload function a bit later.
 1953 >> first of all i tried a QSettings.sync(), but it doesn't help.
 1954 >> i also tried with a global variable, but it also doen't help.
 1955 >> it look like my "update"-function already run before the destructor
 1956 >> source was done.
 1957 >>
 1958 >> now i removed the destructor ~xxx and replaced it by a protected: void
 1959 >> closeEvent(QCloseEvent *event);
 1960 >>
 1961 >> now all work fine. it look like the protected: void
 1962 >> closeEvent(QCloseEvent *event); wait long enough.
 1963 >>
 1964 >> so a destructor run simultaneously? so it is critical to use
 1965 >> destructors with qt, because they might be to slow? (for example if
 1966 >> you clear variables, reload variables or something like that.)
 1968 2)
 1969 i am not sure if it is a problem.
 1971 it was more an information to you.
 1973 i was able to proove that the destructor is doing his job, but to slow. the
 1974 destructor isn't ready if the function go back to the main programm.
 1975 if i add a delay in the main programm and check if the destructor have
 1976 done his work, then it is ok. but without that delay it isn't ok. so
 1977 destructor is slow (i guess it simply run in a second thread
 1978 simultaniously).
 1980 so the solution is:
 1981 a) adding a delay in main code. (but that is a bad style, especialy because
 1982 i don't know how long it must be)
 1983 b) coding it with an closeEvent. (like in qt book). i coded it with
 1984 closeEvent and it run very fine now.
 1986 i just didn't check if this is maybe also critical for fet. that is why i
 1987 just want to warn you, because it took several hours to find this bug.
 1989 Liviu:
 1991 I think I understood.
 1993 You are right: "The readSettings() and writeSettings() functions must
 1994 be called from the main window's constructor and close event handler as
 1995 follows:" (from http://qt-project.org/doc/qt-4.8/qsettings.html#details)
 1997 I wanted to say: "For efficiency, the changes may not be saved to
 1998 permanent storage immediately. (You can always call sync() to commit
 1999 your changes.)", but looks like you already checked that.
 2001 I think that if the control goes to user interface (like waiting for
 2002 user to click), the critical time is gone. So, I hope your situation
 2003 will not appear.
 2005 I really cannot do all perfectly with closeEvent. There are too many
 2006 files. Maybe in the future.
 2008 127---------------------------------------------------------
 2009 From Volker Dirr:
 2011 Lift the limits for the generation algorithm, like MAX_TEACHERS and
 2014 128---------------------------------------------------------
 2015 From yasin dehghan:
 2017 1- show warning message when enter 2 same activity
 2018 2- add exam date with subject in subject form
 2019 3- add list for teacher to show allow subject for each teacher in techer form
 2021 Liviu Lalescu:
 2023 I will add your suggestions in the TODO, but please explain to us more
 2024 detailed:
 2026 1 - When the user adds two same SPLIT activities?
 2027 2 - I do not understand.
 2028 3 - I think you mean each teacher has his own subjects list?
 2030 yasin dehghan:
 2032 1- no, don't split. when the user add 2 same activity show warning msg and
 2033 don't save 2nd activity
 2035 2- user able to add date of exam for each subject and print exam date with
 2036 subject name, just it, no exam planing and etc
 2038 3- yes, user able select list of allow subject for teacher, when add
 2039 activity, only allow subject show for teacher or show warning msg if select
 2040 don't allow subject
 2042 and other sugestion
 2044 4- user able enter min and max hour of each teacher per week and show this
 2045 min and max hour in teacher statiscal foe compare
 2047 129---------------------------------------------------------
 2048 From Volker Dirr:
 2050 do following speed check:
 2052 check all connections of radio buttons.
 2053 check if they use singnal toggled.
 2055 if you can see 2 times the same slot, then it is bad to use toggled.
 2056 example:
 2057 this is bad:
 2058 connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something(bool)));
 2059 connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something(bool)));
 2061 this is ok:
 2062 connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something1(bool)));
 2063 connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something2(bool)));
 2065 if you can find a bad version, then it should be converted into this:
 2066 connect(radioButton1, SIGNAL(clicked(bool)), this, SLOT(something(bool)));
 2067 connect(radioButton2, SIGNAL(clicked(bool)), this, SLOT(something(bool)));
 2069 reason:
 2070 if you click a button in bad example, then something is called twice!
 2071 (once, because one RB is checked and a second time, because the other RB
 2072 is unchecked).
 2073 if you use click, then something is called only once.
 2075 130---------------------------------------------------------
 2076 From Daniel (on forum, see https://lalescu.ro/liviu/fet/forum/index.php?topic=1224.0):
 2078 Allow activities to span over breaks. (For the moment, a solution is to split activities
 2079 and add constraints two (or three) activities grouped. Another solution is to not
 2080 consider explicitly the breaks in the timetable, but this way the constraints of
 2081 type max hours continuously may not work as needed.)
 2083 131---------------------------------------------------------
 2084 From daviodan:
 2086 After clicking 'Add' in the add activity dialog, he suggests that the students list
 2087 widget should be cleared, because usually the user adds activities for a specific
 2088 teacher (with all his students), then goes to another teacher.
 2090 132---------------------------------------------------------
 2091 From Massimo Mancini:
 2093 Display the total number of hours of an activity: when I divide an activity
 2094 I would see the total of durations of all defined subactivities.
 2095 This total must be updated changing the number/duration of subactivities.
 2097 A good place for this changing label could be near number of sub in
 2098 group *divide*:
 2100 In my mind (italian one) I know that a teacher have 6 hours of a subject,
 2101 only then I think about how divide them.
 2102 See the total expedite and reduce input errors.
 2104 ---
 2106 comment by Liviu Lalescu:
 2108 I added this in the TODO. But there is so little space in the dialog there.
 2110 ---
 2112 comment by Massimo Mancini:
 2114 I think the space is pretty enough. There are two suitable places:
 2116 1. at the side of the field *divide* (too long, what is the max number of
 2117 subactivities? 9, 99, 999?)
 2119 2. below the check *consecutive*
 2121 the format of the label can be as little as T:xxx (5 chars).
 2123 Just this afternoon I spent 2 hours correcting mistakes that I would have
 2124 avoided if such counter was in place. Consider the input of a sequence of activities with
 2125 similar number of subactivities  but different duration of some sub, consider also that the
 2126 tab widget remember the past durations when you reduce and then re
 2127 increases the number of subs... so. it's easy (too easy) to insert a wrong total
 2128 duration, for a real check you must tab all the subs and add: very boring.
 2130 133---------------------------------------------------------
 2131 From Massimo Mancini:
 2133 First, consider this situation...
 2134 1. I'm working on teachers not avalaible (TNA) constraint
 2135 2. I filter on MANC, fet show a blank windows: the constraint on MANC not
 2136 exist.
 2137 3. Good. I add it but the dialog not inherit MANC as selected teacher :-(
 2138 why? In general the dialog add/modify is not linked with existing constraints. Fet
 2139 prevents, of course,  multiple TNA about the same teacher, but I ask you, is it
 2140 possible to link the dialog with existing data?  in this manner the
 2141 add/modify functions would be the same. With the wheel of the mouse I can
 2142 scroll the list of teachers and quick view/modify the existing constraint!
 2144 Second, the comment area. I use it to note some info about the
 2145 contents of fet file. I would like to access the comment
 2146 space more quickly. My suggestion is "reduce the RECENT button and put near
 2147 a COMMENT button"
 2149 NEW	OPEN
 2151 SAVE	AS
 2153 good! isn'it? ;-)
 2155 The best would be if you could show the first line of the comments along with
 2156 the file name in the recents list... so I would avoid to remember...
 2158 134---------------------------------------------------------
 2159 From Pietro (on forum):
 2161 I think would be nice we could enable/disable constraints even in the filtered masks
 2162 (ex: "constraints teacher not available times" mask), and not only in the "all time
 2163 constraints" mask. The "comments" button would be very useful too.
 2165 135---------------------------------------------------------
 2166 From Pietro (on forum):
 2168 I would suggest one more feature:
 2169 it would be very useful to have shortcuts with "ALT or CTRL + key" for the buttons in the various masks all over the FET.
 2170 So we could for example enable, disable or delete the various constraints without have to use the mouse, only the keyboard.
 2172 136---------------------------------------------------------
 2173 From arivasm (on forum):
 2175 I think it would be good if the activities dialog would be actualized every
 2176 time you enter a new one. That could allow to verify the last entered, and
 2177 prevent mistakes, without the need to close the new activity dialog.
 2179 137---------------------------------------------------------
 2180 From Pietro (on forum):
 2182 I think the "pseudo activities" shouldn't be shown in the teacher statistics, or
 2183 should be shown in a separate column. Infact, with actual situation the user can
 2184 confuse real activity with pseudo one and don't know the real situation.
 2186 138---------------------------------------------------------
 2187 From Massimo Mancini:
 2189 If you close and reopen FET, the central tab widget remain on the tab it
 2190 was when you terminated the program.
 2191 When FET start, the focus should be always on the File tab.
 2193 139---------------------------------------------------------
 2194 From Massimo Mancini:
 2196 Please consider to implement a shortcut (Alt+C ?) to popup the comment area...
 2198 140---------------------------------------------------------
 2199 From arivasm (on forum):
 2201 When you set the constraints of the times in which the teachers are not available,
 2202 maybe you don't know how many teachers wil be finally available for each time slot
 2203 (unless you count them manually). So, my suggestion is to include a new statistic
 2204 to show that information, in order to correct impossible constraints before start
 2205 the timetable generation. Of course, an authomatic detection (less teachers
 2206 available than needed) would be better!.
 2208 Liviu Lalescu: Sorry, but I do not understand. I already do a check on the number
 2209 of activities for each teacher, versus his not available times.
 2211 Volker Dirr: Your suggestion isn't that easy as you might think now. It's easy if
 2212 teacher/students have full timetables (all timeslots are used), but it's complicated
 2213 if the tables are not full.
 2215 Liviu already include common checks like that. The checks also need to care about
 2216 timetables that are not full (not all timeslots are used). Maybe the checks can be
 2217 improved if the timetables are full, but that mean: a) you must code a check that
 2218 check if the timetables are full. b) it will help only a few datasets, because most
 2219 datasets (compare examples) don't have full timetables.
 2221 arivasm: Excuse me if my previous post wasn't clear!
 2223 Of course, Volker is right: it will be a weak information know how many teachers are
 2224 available for each time slot if the timetable isn't full. Furthermore, the fact to
 2225 have for each of all time slots more teachers than groups don't will guarantee that
 2226 the whole problem will be solvable. But if the timetable is full, and this condition
 2227 fails at some time slot, it will be certain that the problem will be impossible to solve.
 2229 The idea arose when I was entering the preferences of my workmates and I suspected that
 2230 too many of them were requesting be free at some times, i.e. last class of friday
 2231 (of course!). Then I missed to have a simple account as an alternative in order to avoid
 2232 passing sheet after sheet, looking for the petition and count them.
 2234 141---------------------------------------------------------
 2235 From AZ (on forum):
 2237 I would appreciate a statistical feature that tells the user which constraint(s) is (are)
 2238 causing the greatest number of rejects; if a user could see, during computation, a counter
 2239 that tells him the top 10 blocking constraints, maybe the debugging could be easier.
 2240 I don't know if it's possible, though.
 2242 Liviu Lalescu: Unfortunately, it is probably impossible or it would give wrong results.
 2243 But someone should study this suggestion, so I'm adding it in the TODO.
 2245 142---------------------------------------------------------
 2246 From Etlau (on forum):
 2248 Maximum delta in time for day per week per group. For example 7-7-3-4-5 is unacceptable,
 2249 better will be 5-5-5-5-6. And same for teacher. Yes, you can set max and min activities
 2250 per day, but number need to calculate manualy for every class and teacher, not really
 2251 comfortable.
 2253 143---------------------------------------------------------
 2254 From Etlau (on forum):
 2256 Will be nice to click-and-drop and lock activities in shedule directly.
 2258 144---------------------------------------------------------
 2259 From Etlau (on forum):
 2261 Add "start student day" for activity, like "end student day"
 2263 Liviu Lalescu: I'll add this in the TODO. But if students begin at first hour,
 2264 add preferred times for the activities in the first hours.
 2266 145------------DONE since FET-5.41.0 - 2019-11-20-----------
 2268 146---------------------------------------------------------
 2269 From Frans (on forum):
 2271 I just wonder how the following can be done.
 2273 Let say I set a timetable for a specific term with constraints. The timetable is accepted by everyone and published.
 2275 What 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.
 2277 I do have a problem now. If I import the activities then I must add the constraints from scratch, hundreds of them.
 2279 If there are only one or two constraints and a few changes to the activities that is ot a problem.
 2280 Is 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.
 2282 Is there a solution?
 2284 147---------------------------------------------------------
 2285 From y (on forum):
 2287 y: 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?
 2289 Liviu: 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.
 2291 y: Yes, I think it should work. I'll try this!
 2293 Thanks a lot!
 2295 Maybe, 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?
 2297 148---------------------------------------------------------
 2298 From Christian Kemmer (on forum):
 2300 For the next timetable at our school, I need the following:
 2302 Hours 5 and 6 at one day have the same activity.
 2304 So 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.
 2305 But 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.
 2307 I 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.
 2309 So, 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:
 2310 If 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).
 2312 I hope that I have explained it clearly.
 2314 Thanks for your help.
 2316 ...
 2318 The 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.
 2320 So 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.
 2322 Liviu 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.
 2324 149---------------------------------------------------------
 2325 (see also items #58, #368, and #396)
 2326 From uni_instructor (on forum):
 2328 Finding a good optimized timetable means playing around with the parameters and constraints.
 2330 In 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.
 2331 I 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.
 2332 The "history" of modification-steps would give me a good hint on what steps I could try otherwise.
 2334 150---------------------------------------------------------
 2335 From Nemo (on forum):
 2337 Issue 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.
 2339 What 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.
 2341 The 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.
 2343 151---------------------------------------------------------
 2344 From Anton Anthofer (see also item #275):
 2346 - modify the IDs of (sub)activities.
 2347 - possibility to remove subactivities.
 2348 - multicore generation for multiple timetables generation.
 2350 Also suggested by sln_rj, on forum:
 2352 Is it possible to edit a split option in activity once we entered the data in FET?
 2354 152---------------------------------------------------------
 2355 From yasin dehghan:
 2357 can you add excel export to software
 2358 this is so useful for view and share
 2360 153---------------------------------------------------------
 2361 From Leandro Bueno:
 2363 I 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),
 2364 but, 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,
 2365 but the statistics only considers FET hours, but the FET hour to clock hour relationship is not defined. This relationship would help generate the work
 2366 hours of the teachers (in clock hours). Today, I take the statistics and make a spreadsheet applying the relationship between FET hours and clock hours.
 2368 I think that something like a relationship between FET and clock hours should be interesting to add in future versions, so the teachers statistics could
 2369 be shown in terms of number of activities (as it is today) and clock hours in a quick way, right from the FET interface.
 2371 154---------------------------------------------------------
 2372 From Leandro Bueno:
 2374 Always (or never) use span in the HTML timetables if an activity has
 2375 duration larger than 1.
 2377 155---------------------------------------------------------
 2378 From Leandro Bueno:
 2380 Another suggestion for a future release is the option to only
 2381 "print" to HTML the hours that the students have. In my case, I have
 2382 students divided in turns (morning, afternoon and evening) and each
 2383 turn only have activities in that specific turn. When I generate the
 2384 tables, the morning students' table have the afternoon and evening
 2385 hours as not available (there are restrictions for this in the .fet
 2386 file). The same occurs in the afternoon and evening students. I
 2387 suggest that these not available hours of the students don't end up
 2388 in the final HTML table.
 2390 Amendment by Volker Dirr:
 2392 Should be generalised from "hours" to "hours or days or both".
 2394 156---------------------------------------------------------
 2395 From Yush Yuen:
 2397 It would be cool if there could be an interactive way to do the timetable
 2398 generation. For example, in the middle of the generation, I can remove
 2399 some constraints on the fly, un-allocate allocated activities, move
 2400 activities in different order, ... etc. The work flow might be something
 2401 like this:
 2403 - hit the pause button
 2404 - select activities to be free
 2405 - inactivate any constraints
 2406 - move some activities to the front
 2407 - hit the re-start button
 2409 I suppose it will only benefit some crazy hard timetable like my school.
 2410 Even that, the timetable is probably plain impossible, but such interactive
 2411 approach would make it easier to remove key constraints that makes things
 2412 difficult.
 2414 157---------------------------------------------------------
 2415 From Yush Yuen:
 2417 Is it possible that FET could be
 2418 customized to do the following:
 2420 - Have most of the activities with preferred time and space initially
 2421 - but once being placed, it will be treated as if the time and space
 2422 allocated was not "preferred" so will be free to float
 2424 I am hoping that this way, I can obtain better solution by using a
 2425 completed version, unlock some year, then let the program to run again.
 2427 Liviu: I did such a custom version for Yush, but it turns out not to work
 2428 as needed, because of broken soft constraints.
 2430 158---------------------------------------------------------
 2431 From Yush Yuen:
 2433 (Also suggested by daviodan: multiple selection with Ctrl or Shift in the
 2434 all time/space constraints and activate/deactivate them with a single click).
 2436 It would be great if the list of "all time constraints" could be a
 2437 multiple select box. Currently, the way I unlock allocated time is by going
 2438 to the "all time constraints" list, filter out the years that I want to
 2439 open, then remove them one at a time. Actually, before that, I go to the
 2440 student view of the generated timetable, select all, then click unlock time.
 2442 It would be nice if I can just do multiple selection and click the "remove"
 2443 or deactivate button just once.
 2445 159---------------------------------------------------------
 2446 From Volker Dirr:
 2448 FET -> Data -> Time Constraints -> Activities -> A set of subactivities
 2449 have a set of preferred starting times / time slots.
 2450 Need also the value to select all activities with the same duration.
 2451 (because activities with duration 2 should start only in 1., 3. and 5. hour).
 2452 With this constraint a user would need only to set a single constraint instead
 2453 of adding a lot of constraints or activity tags.
 2455 160---------------------------------------------------------
 2456 From Volker Dirr:
 2458 get rid of some "unneeded" tags in the xml file.
 2459 "unneeded" means: they contain redundant data. this data can be used to
 2460 assert the dataset, but is unneeded.
 2461 for example:
 2462 <Number> in hours list, days list, ...
 2464 161---------------------------------------------------------
 2465 From Volker Dirr:
 2467 if fet can't generate the data ("Cannot generate - please modify your
 2468 data"), then the "view difficult activities" pushbutton is disabled. So a
 2469 user can't search the bug. so a) enable the pushbutton or (maybe even
 2470 better (but only if you use only 100% constraints?)), display the
 2471 difficult activities in that textedit with the "Cannot generate - please
 2472 modify your data" string.
 2474 162---------------------------------------------------------
 2475 From Volker Dirr:
 2477 generation_pre request: warn if activities has 100% same starting time and
 2478 100% preferred room in the same room.
 2480 163---------------------------------------------------------
 2481 From Volker Dirr:
 2483 do an other check in generation_pre.cpp:
 2484 if an activity has only 100% one room possible (by one or more
 2485 constraints), then sum all hours of the same room and check if (number of
 2486 available time slots for room) >= (number of 100% needed slots for this
 2487 room by activities).
 2489 164---------------------------------------------------------
 2490 From Volker Dirr:
 2492 name of constraints isn't always the same:
 2493 fet has for example: "teacher not available times" constraint.
 2494 but it also has :"A set of activities has preferred times"
 2495 But are these times preferred? The opposite times are not available.
 2496 So this constraint should be called "A set of activities has not
 2497 allowed/available times".
 2499 maybe even the "activity prefferd time" is also bad, because it is not
 2500 only preffered. that is a 100% constraint. even the fet interface call it
 2501 "locked". So this constraint should be "An activity has a locked time".
 2503 so we get rid of all "preferred" stuff by that. (using instead only
 2504 "locked" or "not available").
 2506 165---------------------------------------------------------
 2507 From Volker Dirr:
 2509 if a constraint doesn't refer to an activity, then generating shouldn't
 2510 refuse generating. that constraint should be just skipped. Like inactive
 2511 things are skipped. it can warn, but not refuse generating.
 2513 (this is highly useful, because someone hunt bugs in his dataset, he can
 2514 just delete for example some years; just to check if this smaller stuff is
 2515 solveable, but some constraints might now refer to no activity anymore,
 2516 because the activities are deleted.)
 2518 166---------------------------------------------------------
 2519 From Yush Yuen:
 2521 I made a custom version for myself with a "remove all" button
 2522 in the "all constraints" dialog box. I found it necessary for me when I
 2523 want to unlock the time constraint for a whole year after a timetable is
 2524 generated. The "remove all" button in combination with the filter function
 2525 make it very easy to remove a large set of constraints. I was trying to
 2526 change the selection box to a multi-select and have a "remove all selected"
 2527 button, but I couldn't figure out how to do that easily (hard to manage the
 2528 index of array after each removal), so I did the simple remove all instead.
 2529 It worked great for me. So, maybe you can consider something similar for
 2530 your official release.
 2532 167---------------------------------------------------------
 2533 From karim (forum personal message to Liviu Lalescu):
 2535 max gaps (hours) between a set of activities
 2537 Within :
 2538 time constraints -->activities
 2539  -min gaps (hours) between a set of activities
 2540 +max gaps (hours) between a set of activities
 2542 168---------------------------------------------------------
 2543 From Davide Cottignoli (on forum):
 2545 I would suggest a new simple constraint for teacher:
 2546 In 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:
 2547 "Max days per week for a teacher" and "Min days per week for a teacher" that have to set the same value.
 2548 Why not add a "Number of workdays per week for a teacher"?
 2549 In 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.
 2551 169-------------------------DONE----------------------------
 2553 170---------------------------------------------------------
 2554 From agemagician (on forum):
 2556 1- Print the name of the year, group and class under the institute name.
 2557 2- Print the schedule from right to left rather than left to right "very useful for Arabic countries like our academy". - Qt bug (Liviu)
 2558 3- Make a bold line between each day in the printing and light line between periods.
 2559 4- Make a bold line between groups in the printing.
 2560 5- Change the font in the printing.
 2561 6- Export the schedule to excel.
 2563 171---------------------------------------------------------
 2564 From Vlăduț Frățiman (personal email to Liviu Lalescu):
 2566 He suggests to drop activities ids and use instead the teacher, students and subject, because ids might puzzle the new user.
 2568 Also, he suggests to add icons to the buttons.
 2570 172---------------------------------------------------------
 2571 From vlad2005 (on forum):
 2573 For gaps constraints (and others, maybe) specify the interval for which the constraint should action. Useful for instance
 2574 if the user wants teachers to have zero gaps in the morning and in the afternoon, but can have gaps in between these two
 2575 periods.
 2577 173---------------------------------------------------------
 2578 From Davide Cottignoli (on forum):
 2580 I 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.
 2581 I 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?
 2583 174---------------------------------------------------------
 2584 From liquid (on forum):
 2586 I'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.
 2588 175---------------------------------------------------------
 2589 From mouiata (on forum) (regarding the custom Algeria version)
 2591 I 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
 2592 The program is currently the constraint
 2593 a teacher works in an hourly interval max days per week
 2594 This is what allows unloading of several periods of morning and evening for the professor without distinguishing between the morning and evening.
 2595 In Algeria, a lot of professors in favor of unloading the evening than the morning
 2596 I propose to add the the constraint
 2597 The least possible number of evening periods that can be discharged to Professor
 2598 The least possible number of mornings that can be discharged to Professor
 2600 Liviu: Do you mean maximum number, not "least"?
 2602 mouiata: I mean, the minimum number if possible
 2603 If it is not possible The maximum number
 2605 176---------------------------------------------------------
 2606 From clouds (on forum):
 2608 Topic: teachers for hour
 2610 What 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).
 2611 In this way it's possible to see what are the most problematic hours
 2613 177---------------------------------------------------------
 2614 From MarioMic (on forum):
 2616 When I create multiple timetables with fet, to eliminate the bad results (with a high number of conflicts), I have to manually select and
 2617 remove the folders of the bad timetables in the output path. This is especially annoying if I have many timetables since the names of the
 2618 folders do not show the level of conflict (it also would be useful to have this, too), and moreover occupy disk space unnecessarily.
 2620 It would be useful (for the gui and the command line version) to have an option to save only timetables below a configurable threshold of
 2621 maximum level of conflict.
 2623 Liviu Lalescu: since version 5.20.2 we added a detailed report for multiple generation of timetables.
 2625 178---------------------------------------------------------
 2626 From Silver (on forum):
 2628 I suggest you add new window (interface or small editor) for css .
 2629 for hide and view rooms and subject in "teachers_time_horizontal.html" and other timetables.
 2631 179---------------------------------------------------------
 2632 From nouvakis (on forum):
 2634 Min hours per day, max hours per day:
 2636 I use these constraints but there is a problem.
 2637 If I set
 2638 min_hours = 3 and
 2639 max hours = 5
 2640 and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3
 2641 but a better one should be: 5 + 5 + 4 + 4 + 3
 2643 So, I recommend a new constraint like "frequency of max hours per day"
 2644 For my example this new parameter would be 2 (5+5)
 2646 180---------------------------------------------------------
 2647 From Pietro (on forum), also by Matsumoto (on forum):
 2649 --> A part suggested by Pietro is DONE <--
 2651 The second part, suggested by Pietro (on forum):
 2653 It would be very nice if the border between different days was thicker.
 2655 Or, as suggested by Matsumoto (on forum): A common point my colleagues present is that there's very little emphasis between different days
 2656 (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?
 2658 Or, 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
 2659 printing a schedule, both in printable and viewable versions.
 2661 181------DONE since FET-5.21.0 - 3 December 2013------------
 2663 182---------------------------------------------------------
 2664 From Bobby Wise (on forum):
 2666 I 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.
 2668 I think that the print order now is in Activity sequence.
 2670 183---------------------------------------------------------
 2671 From nouvakis (on forum):
 2673 The Min days between activities constraint has a weight percentage which I set to 95%.
 2675 I 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%.
 2677 If this is possible, then the word force should be replaced by something else.
 2679 184---------------------------------------------------------
 2680 From Tonny Chan:
 2682 Please add a multiple select and then add to FET, then I need not to click the students one by one to a course.
 2684 185------------------------DONE-----------------------------
 2686 186---------------------------------------------------------
 2687 From plaldw (on forum):
 2689 Max building changes in a time interval.
 2691 187---------------------------------------------------------
 2692 From llbuenoo (on forum):
 2694 I 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.
 2696 I 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.
 2698 I 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.
 2700 With this table it could be simpler to redistribute Activities or teachers.
 2702 188---------------------------------------------------------
 2703 From Frans (on forum):
 2705 In 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.
 2707 In some institutions the group and subject size are important in calculating workloads and ftes for lecturers.
 2709 The 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.
 2711 189--------------------------DONE---------------------------
 2713 190---------------------------------------------------------
 2714 From Volker Dirr:
 2716 most users use the split year automaticly feature only.
 2717 some need more categories, but that will produce to many subgroups.
 2719 so how about this feature:
 2720 a user can disable the "year-group-subgroup" fet and enable only a
 2721 "year-group" one.
 2722 so he can't modify, add, delete, ... subgroups anymore. subgroups will be
 2723 only used and gererated automaticly in the pregeneration and generation
 2724 part.
 2726 split year automaticly will look the same, but it won't produce subgroups.
 2727 instead of this it still store an integer number with the catagory number
 2728 to each group.
 2730 now only one new basic time constraint is needed:
 2731 (i will explain in 2 steps, but i think it can be imporved by storing that
 2732 value.)
 2734 if you place an activity into a timeslot, then:
 2735 1. step: it need to check if there is already an activity of the same year
 2736 stored.
 2737 no: -> place activity
 2738 yes: -> 2. step
 2740 2. step: check if that activities (same year) (in fact it need to check
 2741 only the first one, because others are already the same) have the same
 2742 category.
 2743 no: -> impossible to place activity
 2744 yes: -> place activity
 2747 i am not 100% sure, but i think with this kind of timetabling we can save
 2748 space and maybe also improve speed.
 2750 the problem is:
 2751 how to implement both features ("year-group-subgroup" fet and enable only
 2752 a "year-group" one.) at the same time without confusing a user?
 2754 191---------------------------------------------------------
 2755 From Boubker (on forum):
 2757 Je tente de générer un emploi  du temps pour mon collège  et je  bute sur un petit problème est le suivant :
 2758 Pour 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 :
 2759 C’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).
 2760 Es ce que vous pouvez me dire comment faire ?
 2762 192---------------------------------------------------------
 2763 From mbarsan (on forum):
 2765 We have a school with 8 periods per day, with a short break every 2 hours.
 2766 There are 3 buildings.
 2767 Teacher may change building during those short breaks.
 2768 So 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.
 2769 If a teacher works in a building at first and second periods, he may change building and work at third period.
 2771 We 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).
 2773 Do you think that we may define a grid of hours to allow building changes only at specific periods?
 2775 193---------------------------------------------------------
 2776 From _indianajones (on forum):
 2778 I think it would be useful, in case of difficult generation, to save the incomplete timetable in a .fet file without stopping the process,
 2779 so I could convert this file with "Excel FET file import 2010 Marco Albano ver 2.0" and try to solve it manually.
 2781 ---
 2783 Liviu Lalescu: Generate, stop, advanced lock -> lock all activities of current timetable -> save file.
 2785 ---
 2787 _indianajones: ...but in this way the generation is definitively stopped.... am I wrong?
 2789 After hours of elaboration I wish to save the best timetable found and let FET goes ahead...
 2790 is it possible?
 2792 ---
 2794 Liviu Lalescu: Oh, sorry, I did not see that you wanted generation to continue.
 2796 I'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.
 2798 Meanwhile, 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.
 2800 194---------------------------------------------------------
 2801 (see also entry #26)
 2802 From russell (on forum):
 2804 I hope FET could plan courses soon.
 2806 195---------------------------------------------------------
 2807 From russell (on forum):
 2809 I 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)
 2811 ---
 2813 Liviu Lalescu:
 2815 It 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.
 2817 These tricks might work:
 2819 - Teacher not available on Thursday;
 2821 - Max days per week for this teacher = 4;
 2823 - 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;
 2825 I hope I got all the details. Please correct me if I am wrong.
 2827 ---
 2829 russell:
 2831 Thanks for your reply.
 2833 Can you please explain to me about "min+max 3"?  Dose it mean exactly 3 days distance (Tuesday to Friday)?
 2835 Dose your solution work for days with different hours (Monday has 8 hours and others 6)?
 2837 ---
 2839 Liviu Lalescu:
 2841 The constraint min, then max days between activities.
 2843 If 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).
 2845 If 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).
 2847 Please think of other solutions, if you want.
 2849 ---
 2851 russell:
 2853 Most 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.
 2855 ---
 2857 Liviu Lalescu:
 2859 Maybe better "Teacher works in a days group from a set of days groups".
 2861 196---------------------------------------------------------
 2862 From russell:
 2864 Maybe adding a Pause/Resume to "Generate new timetable" window (changing Start button after press to Pause).
 2866 (Related to item #277.)
 2868 197---------------------------------------------------------
 2869 From nouvakis (on forum, also from mercurialuser, also on forum):
 2871 If I set
 2872 min_hours = 3 and
 2873 max hours = 5
 2874 and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3
 2875 but a better one should be: 5 + 5 + 4 + 4 + 3
 2877 So, I recommend a new constraint like "frequency of max hours per day"
 2878 For my example this new parameter would be 2 (5+5)
 2880 ---
 2882 Liviu:
 2884 I 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"?
 2886 ---
 2888 Liviu:
 2890 I thought about this. I looked over the present code (official FET-5.23.3, src/engine/generate.cpp).
 2892 1) The changes are very difficult in generate.cpp. There are many possibilities to consider, and maybe a perfect treatment is impossible.
 2894 See 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.
 2896 (I care in these lines above about the gaps.)
 2898 2) The changes are critical in generate.cpp. New timetables might become impossible.
 2900 Anyway, I'll keep this suggestion in my mind. But for now I do not have the courage/possibility to do it.
 2902 I hope that by using some tricks you can overcome the problems.
 2904 See also fet-v.v.v/doc/algorithm/improve-todo-item-197.txt.
 2906 ---
 2908 From mercurialuser:
 2910 Italian school, students have 5 days, 6 periods each.
 2911 Teachers teach 18 periods.
 2913 I 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...
 2915 Is it possible to tell FET that teachers may teach 2 periods and 5 periods only once in a week ?
 2917 I'm testing with minimum hours per day set to 3 but I feel it is a too strict requirements...
 2919 198---------------------------------------------------------
 2920 From Volker Dirr (also from mouiata, on the forum):
 2922 new useful constraint:
 2923 time constraints -> teachers -> max total sum of teachers gaps per week
 2925 199---------------------------------------------------------
 2926 From liquid (on forum):
 2928 I 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.
 2930 Volker:
 2932 Maybe 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!)
 2934 liquid:
 2936 I 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:
 2937 year - 1
 2938 group division: 1. by a and b 2. by i1 and i2 (i for computer science)
 2939 you will get the following groups: 1 a, 1 b, 1 i1, 1 i2
 2940 and subgroups: 1 a i1, 1 a i2, 1 b i1, 1 b i2
 2941 For 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.
 2943 Liviu:
 2945 But why not simply divide by a,b then comp.sci. group 1,comp.sci group 2?
 2947 liquid:
 2949 ...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.
 2951 Volker:
 2953 I 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.)
 2954 Of course new students "wonder" the first day about that shortcuts, but they are clever enough to understand it very fast.
 2956 liquid:
 2958 Oh, 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.
 2960 ---
 2962 liquid suggests also aliases for rooms.
 2964 Also from abautu, on forum: Could you add an extra field for subjects and teachers to allow for a short name/abbreviation of it?
 2965 For example, for a subject called "Classical literature" a short name could be "CL" or "C-101". Then the print timetable features
 2966 would allow to print the short names (i.e. compact timetable) or long names (i.e. normal timetable).
 2968 See also item #324
 2970 200---------------------------------------------------------
 2971 (Added on 2014-10-12)
 2972 From fromturkey (on forum):
 2974 I 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.
 2975 Is it possible with the current algorithm?
 2977 Liviu:
 2979 Unfortunately, I cannot think of how to adapt the FET algorithm to multiple cores.
 2981 201-------------------------DONE----------------------------
 2983 202---------------------------------------------------------
 2984 From Vanyo Georgiev (on forum):
 2986 The last opened FET XML file is opened again at start up.
 2988 (Vanyo Georgiev provided the necessary code changes to do this.)
 2990 203---------------------------------------------------------
 2991 From Vanyo Georgiev (on forum):
 2993 One more place to check for a language .qm file - the work path.
 2995 (Vanyo Georgiev provided the necessary code changes to do this:
 2996 	translation_loaded=translator.load("fet_"+FET_LANGUAGE, QDir::currentPath());
 2997 in fet.cpp.)
 2999 This 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.
 3001 204---------------------------------------------------------
 3002 From Vanyo Georgiev (on forum):
 3004 Save and restore tabWidget current page at start up.
 3006 (Vanyo Georgiev provided the necessary code changes to do this.)
 3008 Liviu: 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.
 3010 Anyway, I'll add this in the TODO, as your suggestion.
 3012 Vanyo 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.
 3014 (Vanyo Georgiev provided the necessary code changes to do this.)
 3016 205---------------------------------------------------------
 3017 From bharatstank (on forum): ( https://lalescu.ro/liviu/fet/forum/index.php?topic=1826.0 )
 3019 bharatstank:
 3021 I have below created a Student structure (having 60 students):-
 3023 (Student) Year - Group - Sub Group
 3025 Year                    Group                    Sub Group
 3026 MBACPM (60)       MBA CPM L (60)     MBACPM G1 (30)
 3027                                                        MBACPM G2 (30)
 3028 Activity Tags:
 3029 Lecture
 3030 Tutorial
 3031 Practical
 3033 Activities created are as follows:-
 3034 1. MBA CPM L (Lecture) of a SUBJECT1 for 2 hours duration is conducted by a FACULTY1 for all the 60 students
 3035 2. MBA CPM G1 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
 3036 3. MBA CPM G2 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
 3037 4. MBA CPM G1 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
 3038 5. MBA CPM G2 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
 3040 6. MBA CPM L (Lecture) of a SUBJECT2 for 2 hours duration is conducted by a FACULTY2 for all the 60 students
 3041 7. MBA CPM G1 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
 3042 8. MBA CPM G2 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
 3043 9. MBA CPM G1 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
 3044 10. MBA CPM G2 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
 3046 and so on...
 3048 How to place the activities - so that:-
 3049 1. 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
 3051 I 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.
 3053 How to achieve this scenario.
 3055 ---
 3057 Liviu:
 3059 I am not sure I understand well, but I think you can use a constraint three activities grouped and two constraints two activities ordered.
 3061 ---
 3063 bharatstank:
 3065 using "constraint three activities grouped and two constraints two activities ordered." - here I need to create manual constraints for all the approx. 200 activities.
 3067 is there a way - where I can create a Standardised constraints using Activity Tag.
 3068 I have defined 3 activity tag (which needs to follow the below sequence):-
 3069 1. Lecture
 3070 2. Tutorial
 3071 3. Practical
 3073 As per the guideline - for subject1 - First lecture is conducted, Then its Tutorial is conducted and then its Practical is conducted.
 3075 In 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)
 3077 how to resolve this issue.
 3078 I have also attached the timetable screenshot:-
 3080 1. Correctly placed activity shown in Green circle
 3081 2. Wrongly placed activity shown in Red Circle
 3083 Here 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.
 3085 ---
 3087 Liviu:
 3089 I do not understand the picture in your attachment.
 3091 If 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.
 3093 About making this automatic for activity tags - I have added this in the TODO list.
 3095 206---------------------------------------------------------
 3096 From Vanyo Georgiev (on forum):
 3098 There are translations of the FET User manual in several languages https://lalescu.ro/liviu/fet/doc/
 3100 I 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.
 3102 207---------------------------------------------------------
 3103 From Volker Dirr:
 3105 someone used split year automatically.
 3107 this year he doesn't need all classes again. class / group "5 d" is not
 3108 needed.
 3109 so he deletes group "5 d".
 3110 but in fact that doesn't improve speed (much), because the number of
 3111 subgroups stays the same.
 3113 but if there will be a question after removing a group (or year) like "do
 3114 you also want to remove all subgroups of this group in all other groups?",
 3115 then the number of subgroups will be reduced and it will be easier to
 3116 generate.
 3118 (Yes, instead of removing a group he could simply use the split year
 3119 automatically once again, but maybe he forgot, he has got a new computer, he
 3120 already changed "presettings" because of other years or the simply fear
 3121 that he will do it incorrect; so he like to use delete group only, because
 3122 it is easier.)
 3124 Volker wrote code for this, but it is not perfectly optimized for speed.
 3125 Below is his code for file fet-v.v.v/src/interface/groupsform.cpp (see
 3126 the string Volker Dirr start/end):
 3128 old file groupsform.cpp - last modified on 8 February 2015 (FET-5.28.0)
 3129 new Volker Dirr's code: 5 October 2015
 3131 ---
 3132 //
 3133 //
 3134 // Description: This file is part of FET
 3135 //
 3136 //
 3137 // 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)>
 3138 // Copyright (C) 2003 Liviu Lalescu <https://lalescu.ro/liviu/>
 3139 //
 3140 /***************************************************************************
 3141  *                                                                         *
 3142  *   This program is free software: you can redistribute it and/or modify  *
 3143  *   it under the terms of the GNU Affero General Public License as        *
 3144  *   published by the Free Software Foundation, either version 3 of the    *
 3145  *   License, or (at your option) any later version.                       *
 3146  *                                                                         *
 3147  ***************************************************************************/
 3149 #include "addstudentsgroupform.h"
 3150 #include "modifystudentsgroupform.h"
 3151 #include "groupsform.h"
 3152 #include "timetable_defs.h"
 3153 #include "timetable.h"
 3154 #include "fet.h"
 3155 #include "studentsset.h"
 3157 #include "longtextmessagebox.h"
 3159 #include <QMessageBox>
 3161 #include <QListWidget>
 3162 #include <QScrollBar>
 3163 #include <QAbstractItemView>
 3165 #include <QSplitter>
 3166 #include <QSettings>
 3167 #include <QObject>
 3168 #include <QMetaObject>
 3170 extern const QString COMPANY;
 3171 extern const QString PROGRAM;
 3173 struct subgroupItem{
 3174 	QString yearName;
 3175 	QString groupName;
 3176 	QString subgroupName;
 3177 };
 3179 GroupsForm::GroupsForm(QWidget* parent): QDialog(parent)
 3180 {
 3181 	setupUi(this);
 3183 	groupTextEdit->setReadOnly(true);
 3185 	modifyGroupPushButton->setDefault(true);
 3187 	yearsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
 3188 	groupsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
 3190 	connect(yearsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(yearChanged(const QString&)));
 3191 	connect(addGroupPushButton, SIGNAL(clicked()), this, SLOT(addGroup()));
 3192 	connect(removeGroupPushButton, SIGNAL(clicked()), this, SLOT(removeGroup()));
 3193 	connect(purgeGroupPushButton, SIGNAL(clicked()), this, SLOT(purgeGroup()));
 3194 	connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
 3195 	connect(groupsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(groupChanged(const QString&)));
 3196 	connect(modifyGroupPushButton, SIGNAL(clicked()), this, SLOT(modifyGroup()));
 3197 	connect(sortGroupsPushButton, SIGNAL(clicked()), this, SLOT(sortGroups()));
 3198 	connect(activateStudentsPushButton, SIGNAL(clicked()), this, SLOT(activateStudents()));
 3199 	connect(deactivateStudentsPushButton, SIGNAL(clicked()), this, SLOT(deactivateStudents()));
 3200 	connect(groupsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(modifyGroup()));
 3202 	centerWidgetOnScreen(this);
 3203 	restoreFETDialogGeometry(this);
 3204 	//restore splitter state
 3205 	QSettings settings(COMPANY, PROGRAM);
 3206 	if(settings.contains(this->metaObject()->className()+QString("/splitter-state")))
 3207 		splitter->restoreState(settings.value(this->metaObject()->className()+QString("/splitter-state")).toByteArray());
 3209 	yearsListWidget->clear();
 3210 	for(int i=0; i<gt.rules.yearsList.size(); i++){
 3211 		StudentsYear* year=gt.rules.yearsList[i];
 3212 		yearsListWidget->addItem(year->name);
 3213 	}
 3215 	if(yearsListWidget->count()>0)
 3216 		yearsListWidget->setCurrentRow(0);
 3217 	else
 3218 		groupsListWidget->clear();
 3219 }
 3222 GroupsForm::~GroupsForm()
 3223 {
 3224 	saveFETDialogGeometry(this);
 3225 	//save splitter state
 3226 	QSettings settings(COMPANY, PROGRAM);
 3227 	settings.setValue(this->metaObject()->className()+QString("/splitter-state"), splitter->saveState());
 3228 }
 3230 void GroupsForm::addGroup()
 3231 {
 3232 	if(yearsListWidget->currentRow()<0){
 3233 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3234 		return;
 3235 	}
 3236 	QString yearName=yearsListWidget->currentItem()->text();
 3237 	int yearIndex=gt.rules.searchYear(yearName);
 3238 	assert(yearIndex>=0);
 3240 	AddStudentsGroupForm form(this, yearName);
 3241 	setParentAndOtherThings(&form, this);
 3242 	form.exec();
 3244 	yearChanged(yearsListWidget->currentItem()->text());
 3246 	int i=groupsListWidget->count()-1;
 3247 	if(i>=0)
 3248 		groupsListWidget->setCurrentRow(i);
 3249 }
 3251 void GroupsForm::removeGroup()
 3252 {
 3253 	if(yearsListWidget->currentRow()<0){
 3254 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3255 		return;
 3256 	}
 3257 	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
 3258 	assert(yearIndex>=0);
 3260 	if(groupsListWidget->currentRow()<0){
 3261 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
 3262 		return;
 3263 	}
 3265 	QString groupName=groupsListWidget->currentItem()->text();
 3266 	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
 3267 	assert(groupIndex>=0);
 3269 	QList<QString> yearsContainingGroup_List;
 3270 	QSet<QString> subgroupsList;
 3271 	//QSet<QString> yearsContainingGroup_Set;
 3272 	foreach(StudentsYear* year, gt.rules.yearsList)
 3273 		foreach(StudentsGroup* group, year->groupsList)
 3274 			if(group->name==groupName){
 3275 				yearsContainingGroup_List.append(year->name);
 3276 				foreach(StudentsSubgroup* subgroup, group->subgroupsList)
 3277 					subgroupsList<<subgroup->name;
 3278 			}
 3280 	assert(yearsContainingGroup_List.count()>=1);
 3281 	QString s;
 3282 	if(yearsContainingGroup_List.count()==1)
 3283 		s=tr("This group exists only in year %1. This means that"
 3284 		 " all the related activities and constraints will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text());
 3285 	else{
 3286 		s=tr("This group exists in more places, listed below. It will only be removed from the current year,"
 3287 		 " and the related activities and constraints will not be removed. Do you want to continue?");
 3288 		s+="\n";
 3289 		foreach(QString str, yearsContainingGroup_List)
 3290 			s+=QString("\n")+str;
 3291 	}
 3293 	int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
 3294 		tr("Yes"), tr("No"), QString(), 0, 1);
 3295 	if(t==1)
 3296 		return;
 3298 	//by Volker Dirr (start)
 3299 	QList<subgroupItem> removeSubgroups;
 3300 	QString removeSubgroupsStringForGUI;
 3301 	foreach(StudentsYear* year, gt.rules.yearsList){
 3302 		foreach(StudentsGroup* group, year->groupsList){
 3303 			if(group->name!=groupName){
 3304 				foreach(StudentsSubgroup* subgroup, group->subgroupsList){
 3305 					if(subgroupsList.contains(subgroup->name)){
 3306 						subgroupItem tmpItem;
 3307 						tmpItem.yearName=year->name;
 3308 						tmpItem.groupName=group->name;
 3309 						tmpItem.subgroupName=subgroup->name;
 3310 						removeSubgroups<<tmpItem;
 3311 						removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n";
 3312 					}
 3313 				}
 3314 			}
 3315 		}
 3316 	}
 3318 	if(removeSubgroups.count()>0){
 3319 		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."
 3320 		 " Should the following subgroups be removed also?");
 3321 		s+="\n"+removeSubgroupsStringForGUI;
 3323 		int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
 3324 			tr("Yes"), tr("No"), QString(), 0, 1);
 3325 		if(t==0){
 3326 			foreach(subgroupItem tmpItem, removeSubgroups){
 3327 				bool tmp=gt.rules.removeSubgroup(tmpItem.yearName, tmpItem.groupName, tmpItem.subgroupName);
 3328 				assert(tmp);
 3329 			}
 3330 		}
 3331 	}
 3332 	//by Volker Dirr (end)
 3334 	/*if(QMessageBox::warning( this, tr("FET"),
 3335 		tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName),
 3336 		tr("Yes"), tr("No"), 0, 0, 1 ) == 1)
 3337 		return;*/
 3339 	bool tmp=gt.rules.removeGroup(yearsListWidget->currentItem()->text(), groupName);
 3340 	assert(tmp);
 3341 	if(tmp){
 3342 		int q=groupsListWidget->currentRow();
 3344 		groupsListWidget->setCurrentRow(-1);
 3345 		QListWidgetItem* item;
 3346 		item=groupsListWidget->takeItem(q);
 3347 		delete item;
 3349 		if(q>=groupsListWidget->count())
 3350 			q=groupsListWidget->count()-1;
 3351 		if(q>=0)
 3352 			groupsListWidget->setCurrentRow(q);
 3353 		else
 3354 			groupTextEdit->setPlainText(QString(""));
 3355 	}
 3357 	/*if(gt.rules.searchStudentsSet(groupName)!=NULL)
 3358 		QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. "
 3359 			"The related subgroups, activities and constraints were not removed"));*/
 3360 }
 3362 void GroupsForm::purgeGroup()
 3363 {
 3364 	if(yearsListWidget->currentRow()<0){
 3365 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3366 		return;
 3367 	}
 3368 	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
 3369 	assert(yearIndex>=0);
 3371 	if(groupsListWidget->currentRow()<0){
 3372 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
 3373 		return;
 3374 	}
 3376 	QString groupName=groupsListWidget->currentItem()->text();
 3377 	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
 3378 	assert(groupIndex>=0);
 3380 	QList<QString> yearsContainingGroup_List;
 3381 	QSet<QString> subgroupsList;
 3382 	//QSet<QString> yearsContainingGroup_Set;
 3383 	foreach(StudentsYear* year, gt.rules.yearsList)
 3384 		foreach(StudentsGroup* group, year->groupsList)
 3385 			if(group->name==groupName){
 3386 				yearsContainingGroup_List.append(year->name);
 3387 				foreach(StudentsSubgroup* subgroup, group->subgroupsList)
 3388 					subgroupsList<<subgroup->name;
 3389 			}
 3391 	assert(yearsContainingGroup_List.count()>=1);
 3392 	QString s;
 3393 	if(yearsContainingGroup_List.count()==1)
 3394 		s=tr("This group exists only in year %1. All the related activities and constraints "
 3395 		 "will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text());
 3396 	else{
 3397 		s=tr("This group exists in more places, listed below. It will be removed from all these places."
 3398 		 " All the related activities and constraints will be removed. Do you want to continue?");
 3399 		s+="\n";
 3400 		foreach(QString str, yearsContainingGroup_List)
 3401 			s+=QString("\n")+str;
 3402 	}
 3404 	int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
 3405 		tr("Yes"), tr("No"), QString(), 0, 1);
 3406 	if(t==1)
 3407 		return;
 3409 	//by Volker Dirr (start)
 3410 	QSet<QString> removeSubgroups;
 3411 	QString removeSubgroupsStringForGUI;
 3412 	foreach(StudentsYear* year, gt.rules.yearsList){
 3413 		foreach(StudentsGroup* group, year->groupsList){
 3414 			if(group->name!=groupName){
 3415 				foreach(StudentsSubgroup* subgroup, group->subgroupsList){
 3416 					if(subgroupsList.contains(subgroup->name)){
 3417 						if(!removeSubgroups.contains(subgroup->name)){
 3418 							removeSubgroups<<subgroup->name;
 3419 						}
 3420 						removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n";
 3421 					}
 3422 				}
 3423 			}
 3424 		}
 3425 	}
 3427 	if(removeSubgroups.count()>0){
 3428 		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."
 3429 		 " Should the following subgroups be removed also?");
 3430 		s+="\n"+removeSubgroupsStringForGUI;
 3432 		int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
 3433 			tr("Yes"), tr("No"), QString(), 0, 1);
 3434 		if(t==0){
 3435 			foreach(QString tmpItem, removeSubgroups){
 3436 				bool tmp=gt.rules.purgeSubgroup(tmpItem);
 3437 				assert(tmp);
 3438 			}
 3439 		}
 3440 	}
 3441 	//by Volker Dirr (end)
 3444 	/*if(QMessageBox::warning( this, tr("FET"),
 3445 		tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName),
 3446 		tr("Yes"), tr("No"), 0, 0, 1 ) == 1)
 3447 		return;*/
 3449 	bool tmp=gt.rules.purgeGroup(groupName);
 3450 	assert(tmp);
 3451 	if(tmp){
 3452 		int q=groupsListWidget->currentRow();
 3454 		groupsListWidget->setCurrentRow(-1);
 3455 		QListWidgetItem* item;
 3456 		item=groupsListWidget->takeItem(q);
 3457 		delete item;
 3459 		if(q>=groupsListWidget->count())
 3460 			q=groupsListWidget->count()-1;
 3461 		if(q>=0)
 3462 			groupsListWidget->setCurrentRow(q);
 3463 		else
 3464 			groupTextEdit->setPlainText(QString(""));
 3465 	}
 3467 	/*if(gt.rules.searchStudentsSet(groupName)!=NULL)
 3468 		QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. "
 3469 			"The related subgroups, activities and constraints were not removed"));*/
 3470 }
 3472 void GroupsForm::yearChanged(const QString &yearName)
 3473 {
 3474 	int yearIndex=gt.rules.searchYear(yearName);
 3475 	if(yearIndex<0){
 3476 		groupsListWidget->clear();
 3477 		groupTextEdit->setPlainText(QString(""));
 3478 		return;
 3479 	}
 3481 	groupsListWidget->clear();
 3483 	StudentsYear* sty=gt.rules.yearsList.at(yearIndex);
 3484 	for(int i=0; i<sty->groupsList.size(); i++){
 3485 		StudentsGroup* stg=sty->groupsList[i];
 3486 		groupsListWidget->addItem(stg->name);
 3487 	}
 3489 	if(groupsListWidget->count()>0)
 3490 		groupsListWidget->setCurrentRow(0);
 3491 	else
 3492 		groupTextEdit->setPlainText(QString(""));
 3493 }
 3495 void GroupsForm::groupChanged(const QString &groupName)
 3496 {
 3497 	StudentsSet* ss=gt.rules.searchStudentsSet(groupName);
 3498 	if(ss==NULL){
 3499 		groupTextEdit->setPlainText(QString(""));
 3500 		return;
 3501 	}
 3502 	StudentsGroup* sg=(StudentsGroup*)ss;
 3503 	groupTextEdit->setPlainText(sg->getDetailedDescriptionWithConstraints(gt.rules));
 3504 }
 3506 void GroupsForm::sortGroups()
 3507 {
 3508 	if(yearsListWidget->currentRow()<0){
 3509 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3510 		return;
 3511 	}
 3512 	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
 3513 	assert(yearIndex>=0);
 3515 	gt.rules.sortGroupsAlphabetically(yearsListWidget->currentItem()->text());
 3517 	yearChanged(yearsListWidget->currentItem()->text());
 3518 }
 3520 void GroupsForm::modifyGroup()
 3521 {
 3522 	if(yearsListWidget->currentRow()<0){
 3523 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3524 		return;
 3525 	}
 3527 	QString yearName=yearsListWidget->currentItem()->text();
 3529 	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
 3530 	assert(yearIndex>=0);
 3532 	int q=groupsListWidget->currentRow();
 3533 	int valv=groupsListWidget->verticalScrollBar()->value();
 3534 	int valh=groupsListWidget->horizontalScrollBar()->value();
 3536 	if(groupsListWidget->currentRow()<0){
 3537 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
 3538 		return;
 3539 	}
 3541 	QString groupName=groupsListWidget->currentItem()->text();
 3542 	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
 3543 	assert(groupIndex>=0);
 3545 	StudentsSet* sset=gt.rules.searchStudentsSet(groupName);
 3546 	assert(sset!=NULL);
 3547 	int numberOfStudents=sset->numberOfStudents;
 3549 	ModifyStudentsGroupForm form(this, yearName, groupName, numberOfStudents);
 3550 	setParentAndOtherThings(&form, this);
 3551 	form.exec();
 3553 	yearChanged(yearsListWidget->currentItem()->text());
 3555 	groupsListWidget->verticalScrollBar()->setValue(valv);
 3556 	groupsListWidget->horizontalScrollBar()->setValue(valh);
 3558 	if(q>=groupsListWidget->count())
 3559 		q=groupsListWidget->count()-1;
 3560 	if(q>=0)
 3561 		groupsListWidget->setCurrentRow(q);
 3562 	else
 3563 		groupTextEdit->setPlainText(QString(""));
 3564 }
 3566 void GroupsForm::activateStudents()
 3567 {
 3568 	if(yearsListWidget->currentRow()<0){
 3569 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3570 		return;
 3571 	}
 3572 	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
 3573 	assert(yearIndex>=0);
 3575 	if(groupsListWidget->currentRow()<0){
 3576 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
 3577 		return;
 3578 	}
 3580 	QString groupName=groupsListWidget->currentItem()->text();
 3581 	int count=gt.rules.activateStudents(groupName);
 3582 	QMessageBox::information(this, tr("FET information"), tr("Activated a number of %1 activities").arg(count));
 3583 }
 3585 void GroupsForm::deactivateStudents()
 3586 {
 3587 	if(yearsListWidget->currentRow()<0){
 3588 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
 3589 		return;
 3590 	}
 3591 	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
 3592 	assert(yearIndex>=0);
 3594 	if(groupsListWidget->currentRow()<0){
 3595 		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
 3596 		return;
 3597 	}
 3599 	QString groupName=groupsListWidget->currentItem()->text();
 3600 	int count=gt.rules.deactivateStudents(groupName);
 3601 	QMessageBox::information(this, tr("FET information"), tr("De-activated a number of %1 activities").arg(count));
 3602 }
 3603 ---
 3605 208---------------------------------------------------------
 3606 From Volker Dirr:
 3608 Code more checks to warn users about conflicting constraints before generating. For example:
 3609 min days between activities and consecutive/grouped activities constraints.
 3611 209---------------------------------------------------------
 3612 From andrealva:
 3614 He is referring to the facility to sort constraints by comments, which was dropped (being considered useless) in FET-5.25.0 and subsequent versions:
 3616 One 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) ...
 3617 it would help to quickly identify them without using the filter ....
 3619 210--------------------------DONE---------------------------
 3621 211---------------------------------------------------------
 3622 From Volker Dirr:
 3624 FET asks if the user is sure he wants to add an activity without students. Maybe the question must also
 3625 include something like "it is correct if you want to add a teacher meeting."
 3627 So that the user is not deterred by the warning in situations in which an activity without students is OK.
 3629 212---------------------------------------------------------
 3630 From Bob Hairgrove (on forum):
 3632 Colors 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:
 3634 Code:
 3636 void AddConstraintStudentsSetNotAvailableTimesForm::colorItem(QTableWidgetItem* item)
 3637 {
 3638 	if(USE_GUI_COLORS){
 3639 		if(item->text()==NO)
 3640 			item->setBackground(QBrush(Qt::darkGreen));
 3641 		else
 3642 			item->setBackground(QBrush(Qt::darkRed));
 3643 		item->setForeground(QBrush(Qt::lightGray));
 3644 	}
 3645 }
 3647 I 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.
 3649 213-------------------------DONE----------------------------
 3651 214---------------------------------------------------------
 3652 From Khalilullah Yosufi:
 3654 ... we expect from software to generate a timetable that we could separate some border or jointed gaps for some teachers
 3655 but there is no any place to define/plan to the software about separating the jointed gaps during a day. Hopefully
 3656 someday we would receive an update version of the FET software that has ability to separate joint gaps we want maybe
 3657 by the name of continuously gaps per day for a teacher. ...
 3659 ---
 3661 Further clarification:
 3663 ... Hope one day we could plan or tell to the FET software to add Maximum continuously gaps per day for a teacher = 01 ...
 3665 ---
 3667 Further clarification:
 3669 I need a gap to be maximum 1 hour continuously.
 3671 215---------------------------------------------------------
 3672 From mercurialuser (on forum):
 3674 To better study the code I'd like to clean generate.cpp:
 3675 - removing all the commented code
 3676 - adding comments to illustrate the algo
 3677 - check to see if I can use some macros for code
 3678 - in randomswap try to remove all that ok* variables that can be reduced to a couple (since they are not used outside their block)
 3679 - remove the #if 1/#endif and if(1) { ... }  blocks
 3681 216---------------------------------------------------------
 3682 From mercurialuser (on forum):
 3684 I'd just like to report some thing that may give a little speedup to the code and to avoid duplicates.
 3686 For 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.
 3688 For assigning these matrixes and some others the code loops (there are 2 variants with different variable names):
 3689 for(int j=0; j<gt.rules.nInternalActivities/*added_act*/; j++){
 3691 The 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.
 3693 217---------------------------------------------------------
 3694 From Bob Hairgrove:
 3696 Liviu:
 3698 > > I wrote in the advice on how to translate to not translate the
 3699 > > large 5 fields in HelpAboutForm_template (which contain difficult
 3700 > > and large fields, subject to future changes). If you check now,
 3701 > > your translation of the About is lost (but it is inevitable).
 3703 ---
 3705 Bob:
 3707 > Wouldn't it be better to have the strings in a separate file where
 3708 > they could be translated, then build the HTML text in a function
 3709 > which is not routed through the tr() macros? None of the HTML stuff
 3710 > should be in the .ts file, anyway ... IMHO.
 3711 > 
 3712 > Should be easy enough since (I assume) there is only one "About..."
 3713 > form. I wouldn't necessarily translate the list of translators, but
 3714 > the names of the languages could be translated and the HTML code built
 3715 > outside of the tr() function as described above.
 3717 ---
 3719 Liviu:
 3721 Unfortunately, I see no easy way to do this. Using a separate file for
 3722 these is not good.
 3724 Even if I used simple text instead of HTML, for each new entry I add
 3725 all the previous translated text is lost, if I lupdate with -noobsolete.
 3727 I will add this correspondence, and your next email which I just
 3728 received, to the TODO list.
 3730 I am not sure what to do.
 3732 ----
 3734 Part 2:
 3736 Bob:
 3738 Of course, if you don't want the HTML in this form to be translated,
 3739 there is a much easier way to get rid of it (see attached
 3740 screenshot). ;)
 3742 (Bob is referring to the property "translatable" of the string.)
 3744 ---
 3746 Liviu:
 3748 :-) Yes, sure, I thought of this, but some people might really want to
 3749 translate in a hypothetical situation. All strings in FET should be
 3750 translatable, I think (I am not sure, though).
 3752 218---------------------------------------------------------
 3753 From Volker Dirr:
 3755 since FET is able to change split year automatically without losing
 3756 activities, it is useful to load and save the settings.
 3757 i don't talk about qsettings. it it already stored there and that is fine.
 3758 but the settings are different a bit. so year 5 and 6 have very similar
 3759 categories and divisions, but year 7-10 have got a bit different.
 3760 so it would be fine to save and load them into a file. so a user can save
 3761 settings for year 5-6 and save settings for year 7-10. i am not sure if
 3762 into the fet file or into a separate file. it has different advantages and
 3763 disadvantages. but i think into a new separate file is a bit better.
 3765 219---------------------------------------------------------
 3766 From chintu and Volker Dirr (on forum):
 3768 chintu: I have 80 teachers in school, in an academic year if one teacher
 3769 leaves the school the work load of the teacher is shared with 5 teachers
 3770 and say about 15 teacher in overall is effected. but remaining 65 teachers
 3771 time table is still the same. If i re generate the time table all 80 teachers
 3772 time table will be effected, i want to retain the time table same for 65
 3773 teachers and only change for 15 how can i achieve this?
 3775 Liviu: You can generate the timetable, then view the timetable for teachers,
 3776 and select all activities for a teacher and click "Toggle lock/unlock".
 3778 Volker: Maybe we should make the unlocking possible without generating the
 3779 timetable, as in the "Advanced lock/unlock" menus.
 3781 Liviu: In this case, do it also for students?
 3783 220---------------------------------------------------------
 3784 From Volker Dirr (on forum):
 3786 When the user clicks "Toggle lock/unlock" with zero selected cells in the
 3787 "Timetable view" dialogs, maybe it would be better to inform more verbosely
 3788 the user: "No activities were locked/unlocked, because no activities were
 3789 selected".
 3791 221---------------------------------------------------------
 3792 From Volker Dirr:
 3794 in years dialog should be an option: increase all years.
 3796 now pseudo code: (mixing strings and int. so real code is a bit more
 3797 complicated)
 3799 foreach(year, yearsList){
 3800  if(year = int){
 3801     newYearsList<<year
 3802  } else {
 3803    warning = "unchanged"
 3804 }
 3806 sort newYearsList from high to low
 3808 foreach(year, newYearsList){
 3809   newIntYear=year++;
 3810   search that year.
 3811   foreach(group, year){
 3812      foreach(subgroup, group){
 3813        if(subgroup.left(year){
 3814          subgroup.replace.left(newIntYear)
 3815        else
 3816          warning = "impossible to rename. maybe modified manualy?"
 3817       }
 3818      if(group.left(year){
 3819        group.replace.left(newIntYear)
 3820      else
 3821        warning = "impossible to rename. maybe modified manualy?"
 3822     }
 3823     if(year.left(year){
 3824        year.replace.left(newIntYear)
 3825      else
 3826        warning = "critical bug!"
 3827    }
 3828 }
 3831 222---------------------------------------------------------
 3832 From Mohamed NAJARI:
 3834 1) Can you add a command to move the teachers, students, materials and activities during entry?
 3835 2) Why not put weight as the 100% value by default instead of 95% during the addition of an activity?
 3837 223---------------------------------------------------------
 3838 From youssouf (on forum):
 3840 My suggestion is : activating the partition button when modifying the teacher's task.
 3841 because :
 3842 1. We enter the teacher's tasks ( choice - subject - Partition - period - etc.)
 3843 2. 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.
 3845 224------------------------DONE-----------------------------
 3847 225---------------------------------------------------------
 3848 From jillali elghazoui (on forum):
 3850 jillali:
 3851 At the end of the production time table
 3852 we sometimes want to change instead of an activity
 3853 But if we follow the normal route of fet its currency fully all activities
 3854 Is there is a way to change the place of this activity specifically
 3855 Without major changes in the other activities
 3857 Liviu:
 3859 Either:
 3861 1) Open from ~/fet-results/data_and_timetable.fet, then unlock a specific activity and regenerate;
 3863 or
 3865 2) After generating, select Advanced lock -> lock all activities of the current timetable. Then unlock a specific activity and regenerate.
 3867 But you may obtain an impossible timetable.
 3869 jillali:
 3871 You're right, we can not get what we wanted
 3872 Is it possible for this to work  a new property under the name:
 3874 "a teacher's not available times with the current  timetable"
 3876 as "not available times" are "the free hours withe the current  timetable"
 3877 And it will save in "a teacher's not available times"
 3878 And when we want to produce a new table we change a table for one teacher
 3880 ---
 3882 We also ask you for a similar property in Students set
 3883 It seems that these characteristics would be more effective
 3884 You can set the blank time
 3885 Although it is possible to move Activitys
 3886 For a teacher or more
 3887 Or for one Student set or for more
 3889 226---------------------------------------------------------
 3890 From AlexL (on forum):
 3892 My proposal is to use transifex for translations: https://www.transifex.com
 3893 It works fine with .ts files, has suggestions for translations, .etc.
 3895 227---------------------------------------------------------
 3896 From MilesM (on forum):
 3898 I 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.
 3900 228---------------------------------------------------------
 3901 From adso (on forum):
 3903 It 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.
 3904 And have a file fet also not complete to import into Excel to be able to work manually.
 3906 229---------------------------------------------------------
 3907 From Volker Dirr:
 3909 About adding constraints students/teachers interval max days per week:
 3911 I think you should clarify it in the interface: In FET you call it only
 3912 "interval start hour" and "interval end hour", but you might say better
 3913 "start at beginning of hour" and "end at end of hour" (or "until end of hour").
 3915 230---------------------------DONE--------------------------
 3917 231---------------------------------------------------------
 3918 From Davide Cottignoli (on forum):
 3920 I often need to input many activities with fixed time in working hours and I find the user interface very tedious.
 3921 It would be more simple if the dialog is divided in two parts a follow:
 3922 On the left a list of activities (not the combo-box or drop-down box).
 3923 On the right a table grid with hours and day and the permission to mark only a square of the grid.
 3925 In 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.
 3927 232---------------------------------------------------------
 3928 From Davide Cottignoli (on forum):
 3930 Implement lock/unlock of activities from a specific building.
 3932 233---------------------------------------------------------
 3933 From Volker Dirr and Liviu Lalescu:
 3935 About coloring the three timetable view dialogs:
 3937 Volker:
 3938 A combobox with "disabled" as first item should be perfect for that task.
 3940 Coloring produces sadly pretty many very similar colors. That should be
 3941 fixed. (for example by skipping similar colors or calculating a fixed
 3942 difference between colors.)
 3944 Liviu:
 3945 The user can wish to choose the coloring of each view, in a settings menu:
 3946 Color teachers view by: Students, Subject, Tag, etc., or disabled, etc.
 3948 234---------------------------------------------------------
 3949 From Luigi Valbonesi:
 3951 When fet generates timetables, to run a parallel routine that saves
 3952 every new generated timetable (the best possible at the moment)
 3953 overwriting the previous and the most difficult ativities with the one
 3954 that blocked the generation. If the computer crashes there will be some
 3955 data to think about and work with.
 3957 235---------------------------------------------------------
 3958 From fernandolordao and Volker Dirr (on forum):
 3960 fernandolordao:
 3961 By default, teachers time constraints are permanently shown at same sequence that we add.
 3962 It 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.
 3963 Similar sort options could be designed to other restrictions.
 3965 Liviu Lalescu:
 3966 I'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
 3968 Volker:
 3969 The 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.
 3971 In fact nearly all constraints and activities should be sorted. For TODO:
 3973 Add a new dialog in FET->advanced->sort
 3975 there should be checkboxes and a sort pushbutton.
 3976 the checkboxes should be:
 3977 sort teacher constraints by teacher names.
 3978 sort students constraints by students names.
 3979 sort room constraints by room name.
 3980 sort teacher names of all activities
 3981 sort students names of all activities
 3982 sort activity tags of all activities
 3984 236---------------------------------------------------------
 3985 From Wizard (on forum):
 3987 Wizard:
 3989 Is there a way to set a minimum distance between first teaching hour and last teaching hour?
 3990 I 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.
 3992 Liviu Lalescu:
 3994 Unfortunately, I think this is impossible. I am not sure it can be implemented in the FET algorithm.
 3996 237---------------------------------------------------------
 3997 From Volker Dirr:
 3999 maybe for the TODO:
 4000 simplify the FET interface.
 4001 it is currently much to confusing if you work with it.
 4002 There are many constraint for a single teacher and all teachers.
 4003 it's unhandy to always check 2 lists.
 4004 in fact there is normally only a single "all" constraint.
 4005 in fact this suggestion should be done similar to students and rooms.
 4007 but i explain now with a single example, so it's easier to explain:
 4008 there are 2 dialogs:
 4009 fet -> data -> time constraints -> teachers -> max gaps per week for a 
 4010 teacher
 4011 fet -> data -> time constraints -> teachers -> max gaps per week for all 
 4012 teachers
 4014 it should be only a single dialog:
 4015 fet -> data -> time constraints -> teachers -> max gaps per week
 4016 the dialog is similar to the current one. just ordered. first the "all" 
 4017 constraints, then the "single" constraints.
 4019 that will help much, since you only need to check a single list now and 
 4020 it is still ordered, because the "all" will be always the first.
 4021 this save a lot of space in the fet main window interface.
 4023 then there are 2 ideas how to implement it.
 4024 idea a)
 4025 fet -> data -> time constraints -> teachers -> max gaps per week
 4026 can stay as "fet -> data -> time constraints -> teachers -> max gaps per 
 4027 week for a teacher" currently is.
 4028 the "add" button must be renamed to "add one". And a "add all" 
 4029 pushbutton must be added.
 4031 idea b)
 4032 we can also remove a lot of dialogs. in this example:
 4033 remove
 4034 fet -> data -> time constraints -> teachers -> max gaps per week for all 
 4035 teachers
 4037 then only modify
 4038 fet -> data -> time constraints -> teachers -> max gaps per week for a 
 4039 teacher
 4040 the combobox of this dialog only need a "all teachers" as first item.
 4042 i prefer variant b, because it will save a lot of code, memory, 
 4043 translations, ...
 4045 238---------------------------------------------------------
 4046 From Volker Dirr:
 4048 The activity description must be more detailed.
 4050 Example:
 4051 If i check FET->Data->time constraint->activities->min days between 
 4052 activities
 4053 the right information box is not detailed enough. i need to more 
 4054 information if i want to decide if the activity should keep 100% or if i 
 4055 can reduce it.
 4056 i need to know also the Duration.
 4057 So instead of for example:
 4058 Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a)
 4059 Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a)
 4061 it should display:
 4062 Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:1)
 4063 Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1)
 4065 because in that case i will keep maybe reduce the weight of that 
 4066 constraint down to 0%.
 4068 but is it for example this:
 4069 Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:2)
 4070 Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1)
 4072 then i will never reduce it under 100%, because a 3 hour activity is to 
 4073 long.
 4075 239---------------------------------------------------------
 4076 From Volker Dirr:
 4078 Shorten the strings in conflicts.txt. They are much too long. Very
 4079 confusing if you read that. (Maybe use shortcuts, sort them by type and
 4080 call the type only at the beginning of the list, ... There are many
 4081 variants to write it more clear.)
 4083 240---------------------------------------------------------
 4084 From Davide Cottignoli (on forum):
 4086 I have this simple suggestion that would, in my case, save a lot of time:
 4088 I 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.
 4089 Often 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.
 4090 So, 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.
 4091 Then regenerate all the timetable to obtain the new HTML even for these teachers.
 4092 Whitout 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.
 4094 Is it possible to do this and speed-up data enter?
 4096 241---------------------------------------------------------
 4097 From ant7 (on forum):
 4099 I do some tricks to make pair of activities to be
 4100 scheduled the same time but in two neighbouring days.
 4101 Because of that I need the constraint:
 4102 Fixed number of days between activities (with default value equal to 1).
 4104 To achive it I use:
 4105 Minimum number of days between activities (set to 1)
 4106  and
 4107 Maximum number of days between activities (set to 1)
 4108 so
 4110 t1-t2>=1day   and   t1-t2<= 1day    give  t1=t2 + 1day
 4112 Could you add this constraint?
 4113 Fixed number of days between activities (with default value equal to 1).
 4115 When I have to click hundreds of times  Min and Max... constraints
 4116 I would save a lot of time if you add this constraint.
 4118 Also from abautu, on forum: A constraint "Exact N days between activities" would imply "Min N days between activities"
 4119 AND "Max N days between activities". I use these two constraints simultaneously in order to force two activities to be
 4120 scheduled in same week days (in an odd/even timetable).
 4122 242---------------------------------------------------------
 4123 From Lizio (on forum):
 4125 Lizio:
 4127 What 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.
 4129 Liviu:
 4131 Maybe you could add activity tags to activities, and use the constraint students activity tag max hours per day?
 4133 Lizio:
 4135 Unfortunately 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.
 4137 For 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).
 4139 Probably 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.
 4141 Liviu:
 4143 I 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.
 4145 To consider a sum of weights might be too difficult to implement.
 4147 243---------------------------------------------------------
 4148 From Lizio (on forum):
 4150 come posso fare a dire a FET che deve mettere due attività concomitanti, ma non fissate, bensì scelte da un insieme?
 4152 Facciamo un esempio:
 4153 La 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.
 4154 Le 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.
 4156 Qualche 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)
 4158 ---
 4160 I 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.
 4162 Now I want in the gymn 2 classes of the same grade and not 2 of different grades.
 4164 The problem is that in my school we have 31 classes...
 4166 I don't want to put toghether 2 classes of my choice as this would be a real hard constrain to be managed.
 4168 244---------------------------------------------------------
 4169 From Arsenio Stabile:
 4171 He has a custom version, so that if he has minimum gaps between building changes = 1,
 4172 if a teacher name ends in " AB", if he changes buildings from hour 3 to 4 from
 4173 a building ending in " A" to a building ending in " B", the gap is no longer necessary.
 4175 Liviu Lalescu:
 4177 I am sorry, but this kind of constraint is too specialized. I cannot
 4178 think of a name and good implementation for everybody to use it. I
 4179 think I'll add your suggestion in the TODO list.
 4181 About you choosing the hours - this can made on your custom version,
 4182 but again I am not sure about a good way to present it to the user.
 4184 Arsenio:
 4186 In Italy it often happens that a school is divided into two buildings
 4187 one hour away for which is required a gap for the exchange and this
 4188 creates a major constraint. Some time ago I saw a commercial program
 4189 that provides the opportunity to do so now the gap is not attributed
 4190 to a teacher if the change takes place in the building at a certain time.
 4192 245---------------------------------------------------------
 4193 From ant7 (on forum):
 4195 After timetable generation
 4196 in timetable tab (teachers, students etc.)
 4197 I can see which activities are time or space locked ( I see LT or/and LS acronims)
 4198 and I can toggle these constraints for one or more activities whith mouse highlighting.
 4199 It would be very usefull If I can see the same signature in HTML files.
 4200 When I updates timetable many times on website
 4201 I would like to tell people that some their activities are already fixed time or place.
 4202 It should be some general option in FET allowing user to decide wether show this tags or not in HTML files.
 4203 When timetable is finished it should be easy switched off visibility of the two tags in all timetable in HTML files.
 4204 I don't want to insert these tags manualy in activity dialog because it is some cumbersome.
 4206 246---------------------------------------------------------
 4207 From Nguyễn Hữu Duyệt (on forum):
 4209 Activate/deactivate more activities at once.
 4211 247---------------------------------------------------------
 4212 From Volker Dirr:
 4214 rethink about all used QList stuff in generate.cpp (in FET version 5.28.3)
 4216 examples:
 4218 Line 293: QList<int>& conflActivities
 4219 conflActivities is used only to check "contains". So isn't a QSet better/faster?
 4221 Line 1990:
 4222 QList<int> occupiedRoomsList;
 4224 it is only used for a foreach. So maybe a QStack or QQueue is better/faster?
 4226 So maybe all should be rechecked.
 4228 Liviu: You are right. The first part is more important, but I also need the
 4229 same order of the conflicting activities, as they are added. So I could
 4230 add a QSet and a QList together. But this will require more memory
 4231 allocation and operation. I am not sure.
 4233 248--------------DONE since FET-5.41.0 on 2019-11-20--------
 4235 249---------------------------------------------------------
 4236 From Handaya:
 4238 DONE since FET-5.29.0 on 15 March 2016 --> 1) what if the html result be colorful also as in the program ?
 4239 (This point was also suggested by hudrea and by Udo Schütz). <-- DONE
 4240 2) what if the colors be the same for the same teacher ?
 4241 3) what if the program allows marking a weekly meeting for all teachers
 4242 without printing every name in the cell of timetable result ?
 4243 4) what if the timetable result be printable or saveable in some diferent
 4244 formats like doc and pdf ?
 4246 Liviu:
 4248 DONE since FET-5.29.0 on 15 March 2016 --> (1) - The HTML results can be colored by using the CSS file. It is too
 4249 difficult for us, the programmers, to color them as in the FET
 4250 interface. <-- DONE
 4252 (2) - In the interface, the colors are the same for the same
 4253 subject/subject+students set. This is what we came to after some
 4254 thinking.
 4256 (3) - This would be possible, but I would need to keep in the .fet data
 4257 file an attribute which does not belong to timetabling, and I prefer
 4258 not to.
 4260 (4) - .doc and .pdf - you could print the timetable to a pdf file, or
 4261 copy/paste the HTML code to a doc file.
 4263 250--------------------------DONE---------------------------
 4265 251---------------------------------------------------------
 4266 From Bobby Wise:
 4268 I suggest that perhaps an additional printout be added that displays
 4269 all the teachers that are not occupied in a particular period.
 4271 So it is basically a Free Teacher timetable printout, but it does not have
 4272 any comments like "Must come earlier" or "Single gap", it just displays the
 4273 names of all the teachers who are not working in that period.
 4275 252--------------------------DONE---------------------------
 4277 253---------------------------------------------------------
 4278 From Benahmed Abdelkrim (on forum):
 4280 Par 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?
 4281 Sometimes 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?
 4283 Liviu:
 4285 I 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.
 4287 Benahmed Abdelkrim:
 4289 oui, 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.
 4290    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.
 4291   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.
 4293    yes, absolutely, you can add it to the TODO file because this feature in my opinion is very useful for any time saves.
 4294     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.
 4295    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.
 4297 254---------------------------------------------------------
 4298 From Benahmed Abdelkrim (on forum):
 4300  j'ai deux suggestions:
 4301             la première:
 4302    pourquoi ne ajouter dans le dossier fet-results, un fichier qui permet de savoir les horaires des salles vide?
 4303   ce fichier va aider a mieux contrôler l'énergie électrique en éteignant la lumière le temps que ces salles soit vides.
 4304   la deuxième:
 4305                cette opération qui ce fait maintenant de façon manuelle. peut on la rendre automatique via un logicielle lié a FET?
 4307 I have two suggestions:
 4308   the first:
 4309                 why not add in the folder fet-results, file that lets you know the times of empty rooms? as the file: Teachers Free Periods
 4310                 This file will help better control the electric power by turning off the light as long as these rooms is empty.
 4311   the second:
 4312                    this operation that now done manually. can we make it automatic via a software related to FET?       
 4314 Volker Dirr:
 4316 about first suggestion:
 4317 Rooms Free Periods: In my opinion only needed if you want to swap a room. I think i can add it if Liviu agree.
 4318 On the other hand you can already do it today with TiTiTo (selecting empty rooms; swap rooms; ...)
 4319 Also: 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.
 4320 We 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.
 4322 about second suggestion:
 4323 i 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?
 4325 255---------------------------------------------------------
 4326 From math user (on forum):
 4328 It would be great if "teachers", "subjects", ... would be customizable (settings). For universities "lecturers" and so on.
 4330 256---------------------------------------------------------
 4331 From ChicagoPianoTuner:
 4333 I have a feature request for FET: in the timetables menu after a successful
 4334 generation, there is a button to "lock/unlock" all activities when I'm
 4335 looking at a particular subgroup or teacher or room. If I click it, all
 4336 activities lock, and clicking again unlocks. I would prefer two separate
 4337 buttons, one for lock and one for unlock. The reason is sometimes I have 4
 4338 subgroups where they share many activities (but not all activities), and I
 4339 want to lock all activities for that particular group (or year) but cannot
 4340 do it all at once.
 4342 Liviu:
 4344 Unfortunately, there is not enough space in that dialog.
 4346 257---------------------------------------------------------
 4349 All the users to start FET by double-clicking a .fet file (so that the FET executable won't complain:
 4350 "To start FET in interface mode, please do not give any command-line parameters to the FET executable.").
 4351 We could open in such a case the first file given as a command-line parameter to the FET executable.
 4353 Liviu:
 4354 It is bad to mix the version accepting command-line parameters (fet-cl) with the one not accepting them (fet).
 4356 258---------------------------------------------------------
 4357 From Benahmed Abdelkrim (on forum):
 4359 FET 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..
 4361 Liviu: It is a bit weird to export the constraints - what format to choose?
 4363 Also suggested by sln_rj, on forum.
 4365 259---------------------------------------------------------
 4366 From Benahmed Abdelkrim (on forum):
 4368 write directly into cells Activity planning, especially for the activities which are not divided(not split).
 4369 for the activities that are divided, we can momentarily kept the weight by fefaut (95%), and later change it if we want.
 4371 260----------------------DONE-------------------------------
 4373 261---------------------------------------------------------
 4374 From Volker Dirr:
 4376 a second rooms statistic:
 4378 print all activities with the (maybe) used rooms.
 4379 but only an unordered list will be "bad" to read/check.
 4380 so there should be a not only a simple list.
 4381 there should be a filter to check faster.
 4382 so filter all activities by subject, teacher or students set.
 4384 262---------------------------------------------------------
 4385 From Volker Dirr:
 4387 add a new column in "fet -> Statistics -> Teachers Statistics"
 4388 the column get the name "teachers qualification".
 4389 so the user can see the the data that he entered.
 4391 and:
 4393 add a new column in "fet -> Statistics -> Subjects Statistics"
 4394 the column get the name "teachers qualification".
 4395 so the user can see the the data that he entered (indirectly).
 4397 263---------------------------------------------------------
 4398 From math user (on forum):
 4400 math user: It would be great if components / subactivities always get the same room (option).
 4402 Liviu: You have the constraint activities occupy max 1 different rooms.
 4404 math user: Yes, that is exactly how I have solved it. But I have to enter a condition for each activity
 4405 (lots of conditions). Therefore a (global) setting "same room for all components of an activity" would be nice.
 4407 264---------------------------------------------------------
 4408 From Volker Dirr:
 4410 at the end of the generating algorithm, so after all activities are
 4411 placed (but before locking the activities?!) there should be a simple
 4412 algorithm that cares about rooms "bugs". this algorithm must not be
 4413 perfect, it should only fix "bad" stuff.
 4414 1) check if there is an activity without a room, even if it is got a space
 4415 constraint with weight less then 100%
 4416 2) if there is an activity with a room, it should check if it is
 4417 possible to place a smaller room to this activity
 4418 3) maybe repeat step 2 a few times to get a better result. (the result
 4419 might not be perfect, but it is ok.)
 4421 265---------------------------------------------------------
 4422 From math user (on forum):
 4424 It 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).
 4425 Like that, the user does not have to change the values manually after each generation.
 4427 266---------------------------------------------------------
 4428 From Volker Dirr:
 4430 Generating a difficult timetable shows 28 h... . Should it show 1 d 4 h... ?
 4432 267---------------------------------------------------------
 4433 From daltinkurt (on forum):
 4435 A 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?
 4437 268---------------------------------------------------------
 4438 From Volker Dirr:
 4440 maybe we can add a check for this:
 4442 teacher max hours per day is lower than activity duration.
 4444 269-------DONE since FET-5.34.0-(26 October 2017)-----------
 4446 270---------------------------------------------------------
 4447 From auriolar (on forum):
 4449 It would be nice to be able to limit the time a teacher is in the school.
 4451 I 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.
 4452 This 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).
 4454 I 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.
 4456 Liviu 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
 4457 for each teacher (a solution which you partially imply).
 4459 271---------------------------------------------------------
 4460 From auriolar (on forum):
 4462 I 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.
 4463 Maybe it could be done for rooms to.
 4465 272---------------------------------------------------------
 4466 From Bob Hairgrove (on forum):
 4468 When 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.
 4470 This 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.
 4472 Or is there a better way?
 4474 Liviu 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.
 4476 273---------------------------DONE--------------------------
 4478 274---------------------------------------------------------
 4479 From Benahmed Abdelkrim (on forum):
 4481 Sometimes 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 ?.
 4483 If this feature is created, the tables will be lightweight, and easy to read.
 4485 275---------------------------------------------------------
 4486 From Anton Anthofer (see also item #151):
 4488 - remove the "modify subactivity" menu and move that feature into the "normal" activity menu.
 4489 - modify the id
 4490 - recalculate the ids
 4491 - a complex calculation of the number of students.
 4492 - generate very similar timetables
 4494 276---------------------------------------------------------
 4495 From Volker Dirr:
 4497 a) Add also conflicting activities into
 4498 activitiesConflictingPercentage if there is a constraint with:
 4499 activities with min days between activities and weight 100%
 4500 two grouped activities with weight 100%
 4501 two consecutive activities with weight 100%
 4502 two ordered activities with weight 100%
 4503 min gaps between activities with weight 100%
 4505 b) Check if it speedups if there is a QList/QSet timetable[hours_per_week] and
 4506 checking the activitiesConflictingPercentage at the very beginning.
 4507 because activitiesConflictingPercentage contains a lot of constraints.
 4509 Liviu Lalescu: I think this is impossible/infeasible.
 4511 277---------------------------------------------------------
 4512 From mercurialuser (on forum) (and similar, from JBoss, also on forum):
 4514 In 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
 4515 possible to "pause" a run and "restart" it later, surviving a pc reboot?
 4517 From JBoss:
 4519 I 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
 4520 to switch off the PC but doesn't want to loose the N-hours of elaboration done so far.
 4522 (Related to item #196.)
 4524 278---------------------------------------------------------
 4525 From mercurialuser (on forum):
 4527 If you can't change a value (usually a 100% setting, or allow empty days) please disable the widget... it is misleading...
 4529 Rewording by mercurialuser:
 4531 There are some constraints that must have the % field set to 100. Unfortunately the field is editable and it causes confusion, expecially for newcomers.
 4533 I suggest to keep the field on screen but just disable it, make it not editable...
 4535 279---------------------------------------------------------
 4536 From mrtvillaret (on forum):
 4538 In the add constraint teacher not available dialog mark with "b" the slots in which there is a global break.
 4540 Liviu Lalescu: also in students set or room not available and activity(ies) preferred times?
 4542 280---------------------------------------------------------
 4543 From Lizio (on forum):
 4545 It could be helpful to put disable and enable buttons in every windows about constraints, not only in the "All" ones.
 4547 It could be helpful too to put those buttons also on windows about activities.
 4549 281---------------------------------------------------------
 4550 From Lizio (on forum):
 4552 I think it could be very helpful to let multiple selection in every window about data and constraints.
 4554 In this way you can select some of them to apply actions with buttons.
 4556 282---------------------------------------------------------
 4557 From Volker Dirr:
 4559 Volker provided code for a faster generation if one uses constraints room not available times. But it is too risky for now.
 4560 Maybe in the future.
 4562 Volker: Disalow timeslots of activities if a room is not available.
 4564 Volker's code:
 4566 ...
 4567 Matrix2D<double> notAllowedTimesPercentages;
 4568 Matrix2D<double> notAllowedTimesPercentagesFromSpaceConstraints;
 4570 //breaks are no gaps - I keep track of this
 4571 //bool breakTime[MAX_HOURS_PER_WEEK];
 4572 ...
 4574 ...
 4575 	t=computeActivitiesRoomsPreferences(parent);
 4576 	if(!t)
 4577 		return false;
 4579 	//Before computeFixedActivities(...)
 4580 	t=computeNotAllowedTimesPercentagesFromSpaceConstraints(parent);
 4581 	if(!t)
 4582 		return false;
 4583 	//////////////////
 4585 	/////////buildings
 4586 	t=computeMaxBuildingChangesPerDayForStudents(parent);
 4587 	if(!t)
 4588 		return false;
 4589 ...
 4591 ...
 4592 bool computeNotAllowedTimesPercentagesFromSpaceConstraints(QWidget* parent)
 4593 {
 4594 	Q_UNUSED(parent);
 4596 	//Speed improvement (start) by Volker Dirr
 4597 	notAllowedTimesPercentagesFromSpaceConstraints.resize(gt.rules.nInternalActivities, gt.rules.nHoursPerWeek);
 4599 	//TODO: check if this is correct
 4600 	for(int i=0; i<gt.rules.nInternalActivities; i++){
 4601 		for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
 4602 			notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=-1;
 4603 		}
 4604 	}
 4606 	for(int i=0; i<gt.rules.nInternalActivities; i++){
 4607 		if(!unspecifiedPreferredRoom[i]){
 4608 			bool roomsWithWeight100Found=false;
 4609 			QSet<int> allowedRoomsSet;
 4610 			for(int kk=0; kk<activitiesPreferredRoomsList[i].count(); kk++){
 4611 				PreferredRoomsItem& it=activitiesPreferredRoomsList[i][kk];
 4612 				if(it.percentage==100){
 4613 					if(!roomsWithWeight100Found){
 4614 						allowedRoomsSet=it.preferredRooms;
 4615 						roomsWithWeight100Found=true;
 4616 					}
 4617 					else{
 4618 						allowedRoomsSet.intersect(it.preferredRooms);
 4619 					}
 4620 				}
 4621 			}
 4622 			if(roomsWithWeight100Found){
 4623 				if(!allowedRoomsSet.isEmpty()){
 4624 					for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
 4625 						bool noRoomAvailable=true;
 4626 						foreach(int room, allowedRoomsSet){
 4627 							if(notAllowedRoomTimePercentages[room][hour]!=100){
 4628 								noRoomAvailable=false;
 4629 								break;
 4630 							}
 4631 						}
 4632 						if(noRoomAvailable){
 4633 							if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){
 4634 								notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100;
 4635 							}
 4636 						}
 4637 					}
 4638 				} else {
 4639 					//TODO report a warning. There is no allowed slot at all
 4640 				}
 4641 			}
 4642 		}
 4643 		else{
 4644 			if(!unspecifiedHomeRoom[i]){
 4645 				if(activitiesHomeRoomsPercentage[i]==100){
 4646 					for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
 4647 						bool noRoomAvailable=true;
 4648 						foreach(int room, activitiesHomeRoomsHomeRooms[i]){
 4649 							if(notAllowedRoomTimePercentages[room][hour]!=100){
 4650 								noRoomAvailable=false;
 4651 								break;
 4652 							}
 4653 						}
 4654 						if(noRoomAvailable){
 4655 							if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){
 4656 								notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100;
 4657 							}
 4658 						}
 4659 					}
 4660 				}
 4661 			}
 4662 		}
 4663 	}
 4664 	//Speed improvement (end) by Volker Dirr
 4666 	return true;
 4667 }
 4669 bool computeMinDays(QWidget* parent)
 4670 ...
 4672 ...
 4673 bool computeFixedActivities(QWidget* parent)
 4674 {
 4675 	bool ok=true;
 4677 	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
 4678 		int notAllowedSlots=0;
 4679 		for(int tim=0; tim<gt.rules.nHoursPerWeek; tim++)
 4680 			if(notAllowedTimesPercentages[ai][tim]==100 || notAllowedTimesPercentagesFromSpaceConstraints[ai][tim]==100)
 4681 				notAllowedSlots++;
 4683 		if(notAllowedSlots==gt.rules.nHoursPerWeek){
 4684 ...
 4686 ...
 4687 	s+=GeneratePreTranslate::tr("End - the order of activities (id-s)");
 4688 	s+="\n";
 4689 	initialOrderOfActivities=s;
 4691 	if(initialOrderStream!=NULL){
 4692 		(*initialOrderStream)<<s;
 4693 		(*initialOrderStream).flush();
 4694 	}
 4696 	//After computing the initial order, because it is already taken care of.
 4697 	//Speed improvement (start) by Volker Dirr
 4698 	for(int i=0; i<gt.rules.nInternalActivities; i++)
 4699 		for(int t=0; t<gt.rules.nHoursPerWeek; t++)
 4700 			if(notAllowedTimesPercentagesFromSpaceConstraints[i][t]==100)
 4701 				notAllowedTimesPercentages[i][t]=100;
 4702 	//Speed improvement (end) by Volker Dirr
 4703 }
 4704 ...
 4706 283--------------DONE since FET-5.41.0 (2019-11-16)---------
 4708 284---------------------------------------------------------
 4709 From alienglow (on forum):
 4711 Could you please add a setting to display the full file path of the data file in the title bar.
 4712 e.g. Instead of showing just "datafile.fet" if there can be a setting to display "D:\Data\FET\datafile.fet".
 4713 You can also think of doing this via a status bar, where if possible more info can be displayed.
 4714 For the statusbar you can have display options like - data file name, current output directory etc.
 4716 285---------------------------------------------------------
 4717 From mercurialuser (on forum):
 4719 In 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.
 4721 I then added a "TEACHER max hour per day with a tag" constraint set to 3.
 4723 All the test run with (where I disable the most strict constraints) completed the timetable.
 4725 When all the constraints were enabled, no way to go upper than a value, in all the runs.
 4727 I 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....
 4729 I moved the constraint to Students....
 4731 I 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
 4733 286---------------------------------------------------------
 4734 From noddy11:
 4736 He asks if there is an easier way to activate/deactivate activities. It is to complicated since he needs do it many times.
 4737 A first solution might be that the "active" checkbox in activities will be related to all subactivities. Activating subactivities only by the modify subactivities form.
 4738 An other solution might be activating similar to the activating of constraints.
 4740 287---------------------------------------------------------
 4741 From Davide Cottignoli (on forum):
 4743 Is 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?
 4744 This can speed up manual adjustment when a timetable is generated and, virtually, can speed up the locks for any activities aggregation.
 4746 288---------------------------------------------------------
 4747 From Devrim Altınkurt (on forum):
 4749  think, maybe you can think about only place AN ACTIVITY (not two acts / subacts) over a break.
 4750 i know it is diffucult problem. but i know there are another schools which want you do this in Turkey.
 4751 maybe you add an option ([ X ] can place over a break) for each activity (not subacts)
 4752 and the users can choice if the lesson place like this or not.
 4754 289---------------------------------------------------------
 4755 From Davide Cottignoli (on forum):
 4757 He suggests that it is possible for the user to change from LT (locked time) to PLT (permanently locked time) and viceversa and from
 4758 LS (locked space) to PLS (permanently locked space) and viceversa, from the timetable view dialogs, by selecting cells.
 4760 290---------------------------------------------------------
 4761 From Devrim Altınkurt (on forum):
 4763 i think there is a bug about "Activity tag preferred room(s)" constraint.
 4764 i attached a fet file. you can take a look at it.
 4766 bug steps:
 4768     time table: 1 day and 12 hours
 4769     added some lessons, student groups, ...
 4770     added 13 activities with 1 hour to different subgroups and subjects
 4771     added a tag to all activities
 4772     added an "Activity tag preferred room(s)" with this tag and one room.
 4773     there is not enough room but FET don't detect this.
 4775 Liviu Lalescu:
 4777 It is not a bug, it is more like a suggestion.
 4779 291---------------------------------------------------------
 4780 From thanhnambkhn (on forum):
 4782 When investigating Fet command line source code, I see there are 2 types of return value: return 0 or 1 (fet.cpp), therein:
 4783 - Value "1" means error (can not generate time table) always.
 4784 - But value "0" somewhere mean success, but somewhere mean error (when time exceed or abort). (fet.cpp - line 1380)
 4786 I 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)
 4788 Liviu: I consider that my way of treating this is better.
 4790 292---------------------------------------------------------
 4791 From Malamojka (on forum):
 4793 Notebook:
 4795 1. 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.
 4796 2. 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.
 4797 3. 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).
 4799 293---------------------------------------------------------
 4800 From Malamojka (on forum):
 4802 I 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.
 4804 294---------------------------------------------------------
 4805 From Malamojka (on forum):
 4807 When 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.
 4809 295---------------------------------------------------------
 4810 From Malamojka (on forum):
 4812 Four suggestions on constraints:
 4813 1. Would it be possible to add: space -> Activities -> An activity has a preferred building. It would help me a lot.
 4814 2. 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)?
 4815 3. Is it possible to have variable weight on teachers not available time (for their ideal time, set at maybe 99%)?
 4816 4. 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).
 4818 Liviu:
 4820 1. You can add a new tag, then constraint activity tag preferred rooms, then add this tag to all implied activities. It should be easy.
 4821 2. 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.
 4822 3. Please use constraint activities preferred time slots.
 4823 4. 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.
 4825 For point 2. please see also item #364.
 4827 296---------------------------------------------------------
 4828 From Malamojka (on forum):
 4830 My 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).
 4832 297---------------------------------------------------------
 4833 From thanhnambkhn (on forum):
 4835 From 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.
 4836 I think you should consider design Fet in the future in this way:
 4837 - FET-cl is core
 4838     + With many options, apis,
 4839     + Allow to extend or customize but keep work with the official
 4840     + With standard output (xml, json ...)
 4841 - FET desktop (or any other App) is only front-end, calls to these Fet-cl 's api.
 4842 By 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)
 4844 298---------------------------------------------------------
 4845 From canhathuongnhau and Volker Dirr (on forum):
 4847 Volker:
 4849 The dataset is impossible.
 4850 It is very easy to prove that.
 4851 Please check teacher T.
 4852 That teacher is teaching 24 hours.
 4853 Now 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
 4854 the morning. So there are only 25-2=23 slots left.
 4855 It is impossible to set 24 hours into 23 free slots.
 4857 Could we add a test for this?
 4859 Liviu:
 4861 It 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
 4862 activities, each one with its preferred time slots.
 4864 299---------------------------------------------------------
 4865 From Volker Dirr:
 4867 don't always break/disallow generating if there is a warning at the 
 4868 beginning. that is pretty bad. sometimes FET gives warnings, even if the 
 4869 dataset is solveable. (For example if you add an activity tag, but no 
 4870 activity is using that activity tag). i like that FET is reporting this 
 4871 potential bug. But the FET behavior is bad, since 
 4872 it shouldn't disallow generating.
 4874 also maybe rethink about printing all warnings into a single 
 4875 string/editor. since by this i can copy and paste those warnings and fix 
 4876 them all at one. at the moment i always need to read and fix it always 
 4877 step by step (because i can't remember always all reported bugs, especially 
 4878 if i check datasets from other users and or if i can't even read the 
 4879 characters (Arabic, Russian, ...)
 4881 300---------------------------------------------------------
 4882 From Jijo Jose:
 4884 1.  Export the result to Excel format
 4885 2.  Add xml dtds for xml display
 4887 301---------------------------------------------------------
 4888 From Julio González Gil (on forum):
 4890 Rephrased by Liviu Lalescu:
 4892 We need more preliminary tests for the constraint teacher(s) min hours daily, to avoid
 4893 unnecessary work to discover the bugs. For instance, if we have teacher(s) min 2 hours daily
 4894 with allow empty days, and:
 4896 - The teacher is only available one hour on a day, or
 4897 - The teacher has one activity divided into two components, 100% min 1 days between them,
 4898 each component having duration 1.
 4900 302---------------------------------------------------------
 4901 From Volker Dirr:
 4903 generate multiple: instead of a fixed max time use a more flexible max 
 4904 time. "Calculate max X minutes longer than the time the last max 
 4905 activity was placed" or "Countdown x minutes if no new max placed 
 4906 activity was found"
 4907 so for example thre is a countdown timelimit with 5 minutes.
 4908 as soon as a new max placed activity was found the counter restarts at 5 
 4909 minutes.
 4910   so the time limit is 5 minutes.
 4912 303---------------------------------------------------------
 4913 From Julio González Gil (on forum):
 4915 If 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.
 4917 For 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).
 4919 ---
 4921 Liviu Lalescu: Maybe also for students?
 4923 ---
 4925 Volker Dirr:
 4927 a) fet should show a "speed warning" only. so user can modify hisself
 4928 or
 4929 b) 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.)
 4931 ---
 4933 Julio González Gil:
 4935 I 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).
 4937 ---
 4939 Liviu Lalescu:
 4941 The code could look like:
 4943 			for(int d=0; d<gt.rules.nDaysPerWeek; d++){
 4944 				int nFreeSlotsDay=0;
 4945 				for(int h=0; h<gt.rules.nHoursPerDay; h++){
 4946 					if(!teacherNotAvailableDayHour[tc][d][h])
 4947 						nFreeSlotsDay++;
 4948 				}
 4949 				if(nFreeSlotsDay>0 && nFreeSlotsDay<teachersMinHoursDailyMinHours[tc]){
 4950 					ok=false;
 4952 					int t=GeneratePreIrreconcilableMessage::mediumConfirmation(parent, GeneratePreTranslate::tr("FET warning"),
 4953 					 GeneratePreTranslate::tr("For teacher %1, the constraint min %2 hours daily is useless on day %3. Please make this "
 4954 					 "teacher not available on this whole day, for performance and better correctness checking.")
 4955 					 .arg(gt.rules.internalTeachersList[tc]->name)
 4956 					 .arg(teachersMinHoursDailyMinHours[tc])
 4957 					 .arg(gt.rules.daysOfTheWeek[d])
 4958 					 ,
 4959 					 GeneratePreTranslate::tr("Skip rest"), GeneratePreTranslate::tr("See next"), QString(),
 4960 					 1, 0 );
 4962 					if(t==0)
 4963 						return false;
 4964 				}
 4965 			}
 4967 to be added at the end of the function "bool computeTeachersMinHoursDaily(QWidget* parent)" of file src/engine/generate_pre.cpp.
 4969 304---------------------------------------------------------
 4970 From jillali elghazoui:
 4972 (Also suggested by bachiri401 and Benahmed Abdelkrim)
 4974 In the Add activity dialog, add a check box near Selected (students) list widget. The check box may be called "Activities separately"
 4975 and, if selected, will add more activities, one for each selected students set.
 4977 Liviu 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.
 4978 However, this feature was added in the customized versions for Algeria and Morocco.
 4980 305-----------------------DONE------------------------------
 4982 306---------------------------------------------------------
 4983 From Volker Dirr (on forum):
 4985 Teacher(s) max gaps continuously (a constraint that limits the number of continuous gaps).
 4987 Liviu Lalescu: seems difficult. But you may use a trick: add a dummy activity with duration 1 for each allowed gap for the teacher,
 4988 with activity tag "gaps", then make max gaps per week for that teacher 0, then use constraint teacher max hours continuously
 4989 with activity tag "gaps".
 4991 Volker Dirr:
 4993 The workaround is fine for the full time teachers at my school; but it is bad for part time teachers, since the workaround affects
 4994 also the min/max number of hours per day and also the number of days per week.
 4996 307---------------------------------------------------------
 4997 From math user (on forum):
 4999 The links to each table (#table_12) are great.
 5000 The only problem is that the link for a certain teacher changes when another teacher is added or removed.
 5002 ---
 5004 Why not keep #table_12 and so on and just make them permanent (associated to a certain teacher, group, room, ...)?
 5005 Say #table_12 belongs to teacher Abc: The ID #table_12 is stored for this teacher. Suppose the last stored ID is #table_50.
 5006 Adding a new teacher will result in ID #table_51 being associated with that teacher, and so on.
 5007 Removing say teacher with ID #table_34 will make no changes, i.e. the next new teacher gets ID #table_52.
 5009 There should be a setting to change between consecutive IDs (default - as in the current version) and permenent IDs (my suggestion).
 5010 When switching from permanent to consecutive, all IDs are reallocated when the timetable is generated.
 5012 ---
 5014 Liviu Lalescu:
 5016 Unfortunately, I think this is (very?) complicated.
 5018 ---
 5020 rodolforg:
 5022 Maybe a hash of room name?
 5023 table_roomXXXX where XXXX is a hash?
 5025 ---
 5027 Liviu Lalescu:
 5029 I thought of this, too. But there might appear conflicts, and solving them is not easy. Also, numbers are nicer than a hash value.
 5031 ---
 5033 rodolforg:
 5035 Another option is to convert room/subject/teacher/etc. name to URL encoding? Like http://doc.qt.io/qt-5/qurl.html#toPercentEncoding
 5037 ---
 5039 Volker Dirr:
 5041 that will avoid duplicates.
 5042 advantage is the permanent link.
 5043 disadvantages are that Arabic (and other) users will have trouble to read it and the file size will grow.
 5045 ---
 5047 Liviu Lalescu:
 5049 I think white spaces should also be encoded, which is not done by default?
 5051 But I would not like to implement this in the official version. I prefer the numbers, they are much shorter and nicer. And maybe safer.
 5053 I can add this in the TODO, and if more people ask, I will reconsider.
 5055 308---------------------------------------------------------
 5056 From math user (on forum):
 5058 He refers to the all time/space constraints dialogs:
 5060 What about CTRL+F to select Filter and CTRL+G to select Sorted? That would speed up usage (keyboard only - no mouse needed).
 5062 309---------------------------------------------------------
 5063 From rodolforg (on forum):
 5065 Constraint teacher(s) min continous gaps in window (for instance, the teachers should have 6 continuous gaps on a day, for lunch, when
 5066 the FET time slot corresponds in reality 10 minutes).
 5068 310---------------------------------------------------------
 5069 From Matsumoto (on forum):
 5071 Is LibreOffice exportation planned? Quite a lot of people I present FET to have little to no knowledge about HTML / CSS editing, so being able
 5072 to export the timetables in LibreOffice would really help spread FET around my area.
 5074 See also TODO item #18
 5076 311---------------------------------------------------------
 5077 From Matsumoto (on forum):
 5079 To help see difficult days/times, FET could have a statistics that shows the amount of available teachers at every period of the timetable,
 5080 for 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:
 5082 	Day 1	Day 2 	Day 3
 5083 Hour 1	4	4 	4
 5084 Hour 2	6	2 	4
 5086 I filled in random values for hour 2 just to have more detail
 5088 This should allow the user to quickly spot times where more teachers could be needed before the generation starts. Maybe in addition to the
 5089 number of teachers also have the names?
 5091 From Volker Dirr:
 5093 we can skip this dialog, since it is still too much work to check; it
 5094 can be improved much more!
 5096 add a new (locked) feature:
 5097 "check min teachers per slots (except breaks)"
 5098 Here a user can enter the number of classes (or: if smaller: the number
 5099 of courses).
 5101 Than in generate_pre it is always checked by default if that minimum
 5102 number is fulfilled or not.
 5104 Advantage: you don't always need to check manual
 5105 number_of_slots_per_week every time you added/modified a constraint. You
 5106 only need to add that number one time and it will always check
 5107 automatically.
 5109 312---------------------------------------------------------
 5110 From Vangelis Karafillidis:
 5112 New constraints:
 5114 Teacher(s) max span per week;
 5115 Teacher(s) min span per day;
 5116 Teacher(s) min span per week;
 5117 Teacher(s) min gaps per day;
 5118 Teacher(s) min gaps per week;
 5119 A 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 )
 5121 DONE SINCE FET 5.41.0 on 2019-11-16: Min simultaneous activities from a set in selected time slots.
 5123 DONE SINCE FET 5.41.0 on 2019-11-16: A set of activities occupies min time slots from a selection.
 5125 Also suggested by auriolar, on forum: Teacher(s) max span per week.
 5127 313---------------------------------------------------------
 5128 From Silver (on forum):
 5130 I 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 ... .
 5131 With this suggestion, we add the splits and duration 1 time for the subject.
 5132 Exmple: Physics1 have 2 split in the week, so why I add this info in every activity for Physics1?!
 5134 314---------------------------------------------------------
 5135 From Benahmed Abdelkrim and Volker Dirr (on forum):
 5137 https://lalescu.ro/liviu/fet/forum/index.php?topic=3141.0
 5139 1. Volker Dirr suggests renaming the Algeria and Morocco version to other better names, since they can be used more generally in other countries/institutions.
 5141 2. 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.
 5143 Volker Dirr:
 5145 I think one (maybe) needed is following constraint:
 5146 constraint teacher is working only in one out of two set of times.
 5148 So if teachers should work only in the morning or in the evening, you need to add as many constraint as you have got days:
 5149 the first constraint:
 5150     1. set of times contains all morning hours on Monday.
 5151     2. set of times contains all evening hours of Monday.
 5153 the second constraint:
 5154 similar with Tuesday.
 5155 ...
 5158 This 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.
 5159 That could be also solved with the constraint above: "constraint teacher is working only in one out of two set of times."
 5160 So this time he need to setup like this:
 5161 the first constraint:
 5162     1. set of times contains all night hours on Monday.
 5163     2. set of times contains all morning hours of Tuesday.
 5165 the second constraint:
 5166 ...
 5168 So again as many constraint as you have days (or days-1 if you don't work over weekend).
 5170 ---
 5172 Volker Dirr:
 5174 The other will be the gaps constraints.
 5175 So a constraint like:
 5176 "max gaps per day in an interval" and "max gaps per week in an interval" might be maybe enough.
 5178 So you maybe need to add only 2 constraints:
 5179 1. "max gaps per day in an interval" with the interval : "first hour of of morning" up to "last hour of morning"
 5180 2. "max gaps per day in an interval" with the interval : "first hour of of evening" up to "last hour of evening"
 5182 ---
 5184 Benahmed Abdelkrim:
 5186 I believe it's time to rethink the 2 variants of FET with the official version.
 5187 This 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.
 5189 It is while working on the official version that I recently discovered this bug that accelerated the release of version 5.31.5.
 5191 There 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.
 5193 The time was lengthened in this way (of the hours of waiting), which I have now abandoned this project.
 5195 Now the idea has been raised again but in another way that has encouraged me to intervene here.
 5197 I believe it is possible to use the official version to realize time tables in the Algerian or Moroccan way.
 5198 For this purpose it must consider the addition of the following time constraints:
 5200 1. Min hours in a time interval
 5201 Interval = first hour of morning(or afternoon) - last hour of morning(or afternoon)
 5202 2. max gaps in the last(or first) hour of morning(or afternoon) for students (set)
 5203 3. activity(ies) ends students interval.
 5205 ---
 5207 Benahmed Abdelkrim:
 5209 ...So it is possible -in my opinion - to integrate both versions in official FET, reasoning not by day, but by interval.
 5210 Can open a dialog with the user to define the number of intervals he wants.
 5212  for example:
 5213 Interval1 = first hour of morning - last hour of morning
 5214 interval2 = first hour of afternoon - last hour of afternoon
 5215 interval3 = first hour of evening - last hour of evening
 5216 ...etc.
 5217 And can also define between each interval a constraint of break time.
 5219 In this way can integrate the time constraints specific to 2 versions customized in official FET.
 5221 315---------------------------------------------------------
 5222 From math and Volker Dirr (on forum):
 5224 Constraint order two lists of activities, so that the first list is before the second list.
 5226 316---------------------------------------------------------
 5227 From math (on forum):
 5229 I'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
 5230 I 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.
 5232 We 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
 5233 not 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
 5234 equipped with a chalk board or a white board. While most lecturers prefer white boards, lecturers of math related courses usually prefer chalk boards.
 5236 At 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".
 5237 In 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
 5238 Preferred Rooms" for each of these activities. My problem is exactly the following process of assigning rooms.
 5240 When 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
 5241 of 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
 5242 all 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
 5243 on third floor of building N", "managed by the Computer science department", "Seminar room equipped with Projector and Whiteboard", "capacity for 50 students".
 5244 So if I need a mid-sized seminar room, I have to go all through the list, selecting all matching rooms.
 5246 First, 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
 5247 a 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
 5248 appropriate rooms.
 5250 And I would like to suggest a way that should be easy to implement, not demanding any changes to the timetabling algorithm at all.
 5252 I 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
 5253 the 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
 5254 all 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
 5255 "mid-sized seminar room" with all appropriate rooms.
 5257 Coming 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
 5258 list 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.
 5259 As a matter of fact, I could also select multiple collections or other rooms.
 5261 When 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
 5262 contains. 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.
 5263 This way the algorithm gets the very same input as before, not requiring any changes here.
 5265 I would be more than happy if you could add this collection feature to FET.
 5267 317---------------------------------------------------------
 5268 From math (on forum):
 5270 When 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
 5271 one 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
 5272 than others.
 5274 For 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
 5275 constraint. 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
 5276 generated 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
 5277 manually move the activity from the old lecture hall to the new.
 5279 I 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
 5280 the feature that I miss most in FET.
 5282 In 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
 5283 knows 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
 5284 option "change room to..." could appear with a sub menu holding all the available alternative rooms.
 5286 I'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
 5287 not focus on post-generation optimization at all".
 5289 318---------------------------------------------------------
 5290 From Volker Dirr:
 5292 since multicore CPU are more and more normal today we should rethink 
 5293 about that.
 5294 as i can see it will be impossible ((also?) because of speed) to 
 5295 generate only ONE timetable with multicore.
 5296 so the "only" variant is to generate multiple tables on different core.
 5298 we should already "prepare" the source for this. (it mainly just mean: 
 5299 tidy up. no real "new code" is needed for that.)
 5301 so it mean:
 5302 all variables that didn't change after generate_pre is calculated should 
 5303 be store in a single structure. so all cores can read from that single 
 5304 structure.
 5306 all variables in generate that will be "modified" while generating 
 5307 should be stored into an other structure.
 5309 by that we prepared the source for later. so as soon as we start coding 
 5310 multi core support we just need to do a list of that structure, so each 
 5311 core get/care about its own data.
 5313 (even if we never add multicore this tidy up migth be useful, since it 
 5314 might help reading the source)
 5316 319---------------------------------------------------------
 5317 From Vangelis Karafillidis:
 5319 Two 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.
 5320 (But A1 may be placed immediately after A2).
 5322 Vangelis suggested that this can be solved by using a trick: It can be achieved indirectly with pseudo-activities. let's say A1 real activity,
 5323 P1 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.
 5325 320---------------------------------------------------------
 5326 From Volker Dirr:
 5328 get rid of max_days_per_week and max_hours_per_day.
 5329 one needed step for that is redisigning the interface, since the 
 5330 interface use it.
 5331 it won't be too difficult to fix that.
 5332 just add hours per day and days per week as a QStringList (like teacher 
 5333 names, subject names, ...)
 5334 this dialog should get buttons like in teachers, rooms, subjects, ...
 5335 so add a button with "up" and "down" to move the name.
 5336 "rename"
 5337 "clear all"
 5338 "delete"
 5339 "add"
 5341 the hours per day dialog should maybe also get a button with a spinbox 
 5342 to add X names at once.
 5343 Like name "1", "2", ...
 5344 or "1.", "2.", ...
 5345 or ...
 5347 the days per week dialog should get 3 buttons like:
 5348 "add Monday to Friday" (so it add those 5 days. if you press that button 
 5349 again, it should add once again. so there will be 10 days added (maybe 
 5350 with an attached small string).
 5351 "add Monday to Saturday"
 5352 "add Monday to Sunday"
 5353 "add From a date To a date" So you can select 2 calender dates and it 
 5354 just add all that dates.
 5356 321---------------------------------------------------------
 5357 From Vangelis Karafillidis:
 5359 These new views of FET (teachers/students time horizontal) for modifying an existing timetable seem to work very well. Some more suggestions mainly for facilitating
 5360 the modifications of an existing timetable... The code actually exists! Just to be "connected" to these windows (views).
 5361 Teachers view:
 5362 1) 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,
 5363 teacher available times, max days per week, home room etc.
 5364 2) 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.
 5365 The 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).
 5366 Students view:The corresponding options for the students, as mentioned above.
 5368 I 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.
 5370 But, I don't know how complicated this part is. I have no C++ programming skills, but it seems easy.
 5374 Liviu Lalescu:
 5376 Your suggestions are not so easy to implement.
 5378 322---------------------------------------------------------
 5379 From Vangelis Karafillidis:
 5381 After testing the new display (mainly teachers time horizontal) for partially modifying an existing timetable, I thought of a suggestion. Most likely, it's
 5382 similar to "remove redundant constraints". The suggestion is to add a (percentage) multiplication factor for each one of the "groups" or time constraints.
 5383 This 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
 5384 (for example 98%)Students' time constraints (for example 90%)Activities time constraints (for example 20%) This would affect ONLY the constraints that can have
 5385 weight (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.
 5386 But, 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
 5387 by 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%.
 5388 If 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
 5389 constraints, 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
 5390 above can be easily coded... It might be difficult.... But this was what I thought for facilitating the generation of a temporary timetable by slightly
 5391 modifying the existing one.
 5393 Liviu Lalescu:
 5395 I do not agree with this idea. But I added it in the TODO.
 5397 Please note that max gaps per week/day for students/teachers constraints can only have 100% weight.
 5399 323---------------------------------------------------------
 5400 From Vangelis Karafillidis:
 5402 He suggests that all the constraints teacher not available could be presented in a teachers time horizontal manner (teacher as row, day+hour as column).
 5404 Further suggestions:
 5406 Generally 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.
 5407 Under 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.
 5408 Teacher's not available times: The teachers time horizontal view would be much more flexible
 5409 a) The user could monitor at once all teachers
 5410 b) 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
 5411 lessons 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
 5412 are 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",
 5413 and 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
 5414 not available for this specific hour.
 5415 Student's not available times:For similar reasons the time horizontal view is by far more flexible.
 5416 Please 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
 5417 his/her data efficiently (with the existing GUI).
 5419 Interaction 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
 5420 typical situation at Greek schools). The user might accidentally make this teacher available for a very small number of hours, and therefore the timetable generation
 5421 might 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
 5422 (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
 5423 adds or removes an hour, this number should change.
 5424 An example for the students: The same for the students...
 5426 Similar 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
 5427 better 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
 5428 on his/her data.
 5430 For 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
 5431 needs 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.
 5433 324---------------------------------------------------------
 5434 From rodolforg (on forum):
 5436 Add short names for teachers (and maybe students, subjects, activity tags, rooms).
 5438 See also item #199.
 5440 325---------------------------------------------------------
 5441 From Darren McDonald (on forum):
 5443 I 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.
 5445 I've often got a group of activities that need to have the same starting time, for example
 5447 Mathematical Studies 1 (1+1+1)
 5448 Mathematical Studies 2 (1+1+1)
 5449 Mathematics SL 1 (1+1+1)
 5450 Mathematics SL 2 (1+1+1)
 5451 Mathematics HL (1+1+1+1)
 5453 I 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
 5454 each subject, one for the second subactivity, and one for the third, with the final Mathematics HL subactivity left free), where each constraint involves
 5455 a list of 5 subactivities (which increases the possibility of error).
 5457 Is 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,
 5458 I'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)
 5459 the first 3 subactivities should have the same start time (day+hour).
 5461 326---------------------------------------------------------
 5462 From Darren McDonald (on forum):
 5464 When 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
 5465 (particularly in International Baccalaureate Diploma Programme schools), there are often a number of changes as students change subject choices.
 5467 It 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
 5468 the selected groups from the Modify Activity screen (perhaps below the Clear button?).
 5470 327---------------------------------------------------------
 5471 From Zsolt Udvari (on forum):
 5473 Add a subject tag for each subject (like: "easy" or "hard") and add time constraints for these subject tags.
 5475 328---------------------------------------------------------
 5476 From Valdo (on forum):
 5478 Export the resulted timetables in time horizontal form.
 5480 329---------------------------------------------------------
 5481 From Matthias Söllner:
 5483 Add an option for the FET command-line version, so that after the generation there will be written also the CSV timetable.
 5485 330---------------------------------------------------------
 5486 From Volker Dirr:
 5488 Maybe this is a good time to restart coding csv stuff.
 5489 my old csv stuff was very "powerful" and "compressed", but sadly also 
 5490 very bad "expandable"/(coded).
 5491 also other guys asked for exporting other time constraints. nearly 
 5492 impossible to add that into the old code.
 5494 so i suggest this:
 5495 - we keep the old csv stuff, so everyone can still use this "powerful" 
 5496 feature. it will be also stable (never change the file format anymore).
 5497 - we add a new csv export (and also import). maybe call it "version 2" 
 5498 or "beta" or "experimental" or ...
 5499 - the new code will NOT be able to select the order of the fields (and 
 5500 also not be able to select headers, textquotes and field separator; even 
 5501 i will do that maybe in the source)
 5502 - the first version will be similar to the current default export. so 
 5503 just code simplification.
 5504 - then i will have got the chance to add new features into that code 
 5505 (like exporting other constraints)
 5507 331---------------------------------------------------------
 5508 From Zsolt Udvari (on forum):
 5510 My 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.
 5511 I added it (0. hour) and I saw the hour of all time constraints updated: increased by 1.
 5512 I 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.
 5514 Now 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
 5515 (means there are time constraints) a new hour.
 5517 332---------------------------------------------------------
 5518 From Zsolt Udvari (on forum):
 5520 Maybe a user error (PEBKAC) but I think I share it.
 5522 So I've a little complicated FET-file and it seems the "An activity has a preferred starting time" doesn't work.
 5524 I attached the file and try to generate and check:
 5526     Nr. 895 and 896 activities (without any teacher and student)
 5527     They have preferred starting time: "Szerda 1." (Wednesday) and "Hétfő 3." (Monday) with 100%
 5528     They have same starting time (day+hour) with 7 other activites (for example 647 and 648)
 5529     Generate (without success)
 5530     Check the student's timetable, go to "11A" and the 647 is on "Péntek" (Friday)!
 5532 333---------------------------------------------------------
 5533 From Valdo (on forum):
 5535 A new addition to Spreading activities uniformly in the week for activities split in to 2 components:
 5537 Constraints max days between activities (2 components) with the possibility to select max days and weight.
 5539 334---------------------------------------------------------
 5540 From Zsolt Udvari (on forum):
 5542 I 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.
 5543 I 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).
 5545 335---------------------------------------------------------
 5546 From Volker Dirr:
 5548 There are not many variables to mutex in the generation.cpp. So it will
 5549 be faster to use std::atomic or QAtomic command instead of using mutex.
 5550 (The atomic commands will do a mutex if the cpu doesn't support atomic
 5551 operations. so cpus without atomic support won't generate faster, but
 5552 other cpus will.)
 5554 336---------------------------------------------------------
 5555 From Benahmed Abdelkrim (on forum):
 5557 Constraint min working hours in an interval.
 5559 This 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.
 5561 337---------------------------------------------------------
 5562 From Fernando A F Lordão (on forum):
 5564 After 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
 5565 another situation that occurs in my institution.
 5566 Here 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.
 5567 So, I thought about including two more columns in the statistics file:
 5568 * "Total of Activities"
 5569 * "Different Subjects" (counting different string description of the subjects assigned to the teacher)
 5571 338---------------------------------------------------------
 5572 From mercurialuser (on forum):
 5574 I'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
 5575 happening, which activity is blocked by which constraint, etc etc..
 5577 It 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
 5578 place the remaining activities...
 5580 Liviu Lalescu:
 5582 For part 1) It is difficult, because I cannot rely on more signals. I already use SIGTERM.
 5584 But 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.
 5585 If 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
 5586 logs, and the maximum placed activities. The next one after the maximum placed is problematic.
 5588 For part 2) This would not be possible. If you modify the constraints, the whole thing is changed.
 5590 339---------------------------------------------------------
 5591 From Roberto Bergonzini:
 5593 Manual timetabling - drag and drop.
 5595 Just make a timetable view teachers, keeping only the free days and the not available constraints for the teachers.
 5597 Also suggested by mercurialuser.
 5599 Forum link: https://lalescu.ro/liviu/fet/forum/index.php?topic=3461.0
 5601 340---------------------------------------------------------
 5602 From Emiliano Llano Díaz:
 5604 Improvement 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
 5605 file->open recent, but... you know humans are lazy 😁  )
 5607 341---------------------------------------------------------
 5608 From mohammed (on forum):
 5610 Nous voulons ajouter la fonction de sauvegarde automatique du programme, en cas de travail, l'alimentation s'éteint
 5612 (We would like to add the function of automatic save of the program, in case of work, the power goes off).
 5614 342---------------------------------------------------------
 5615 From Vangelis Karafillidis:
 5617 All students must respect the maximum number of span (in hours) per day -> better write:
 5619 All students must respect the maximum span (in number of hours) per day.
 5621 Circular -> better write: Circularly.
 5623 343---------------------------------------------------------
 5624 From rodolforg:
 5626 What do you think about leaving the version number and date out of
 5627 HelpAboutForm_template.ui ?
 5628 Maybe leaving a placeholder there, and making use of FET_VERSION and a
 5629 l10n version of date.
 5631 That will reduce .ts diff a lot and reduces translator efforts ;)
 5633 344---------------------------------------------------------
 5634 From V Paul C Charlesraj (on forum):
 5636 Minimum number of days in a week for all students.
 5638 Liviu:
 5640 Or for a students set. This is very difficult to implement perfectly (to take care of combinations with the other constraints).
 5642 345---------------------------------------------------------
 5643 From rodolforg:
 5645 (referring to translation of plural forms)
 5647 I also saw this in daysform.cpp :
 5649         if(cnt_rem>0){
 5650             s+=tr("%1 constraints will be removed.", "%1 is the number
 5651 of constraints").arg(cnt_rem);
 5652             s+=" ";
 5653         }
 5654         if(cnt_mod>0){
 5655             s+=tr("%1 constraints will be modified.", "%1 is the
 5656 number of constraints").arg(cnt_mod);
 5657             s+=" ";
 5658         }
 5659         s+=tr("Do you want to continue?");
 5661 Maybe this part could use %n too?
 5663 Liviu Lalescu:
 5665 Yes, it should, also in hoursform.cpp and also in
 5666 alltime/spaceconstraintsform.cpp.
 5668 But I think there are plenty of places to modify and it is really too
 5669 much. But I'll think of it.
 5671 Problem: see for instance alltimeconstraintsform.cpp:
 5673 	constraintsTextLabel->setText(tr("%1 / %2 time constraints",
 5674 	 "%1 represents the number of visible active time constraints, %2 represents the total number of visible time constraints")
 5675 	 .arg(n_active).arg(visibleTimeConstraintsList.count()));
 5677 Which is %n? %1 or %2?
 5679 Also advancedlockunlockform.cpp:
 5681 	QMessageBox::information(&lastConfirmationDialog, tr("FET information"), tr("There were removed %1 locking time constraints and"
 5682 		" %2 locking space constraints. There were not removed %3 locking time constraints and %4 locking space constraints, because"
 5683 		" these activities were permanently locked").arg(removedTime).arg(removedSpace).arg(notRemovedTime).arg(notRemovedSpace));
 5685 It is very difficult.
 5687 I am sorry, but the code is full of such mistakes. It is too late now
 5688 to correct.
 5690 rodolforg:
 5692 Difficult indeed.
 5694 The only way out I can see would be replace:
 5696 "There were removed %1 locking time constraints and %2 locking space
 5697 constraints. There were not removed %3 locking time constraints and %4
 5698 locking space constraints, because these activities were permanently
 5699 locked"
 5701 by:
 5703 "There were removed %1 and %2. There were not removed %3 and %4,
 5704 because these activities were permanently locked"
 5705 where %1 would be "%n locking time constraint(s)", etc.
 5707 346---------------------------------------------------------
 5708 From Taro Tada:
 5710 Either allow two or more users to work concurrently on a unique FET file, or allow the merging of two or more .fet files.
 5712 347---------------------------------------------------------
 5713 From bachiri401 (on forum):
 5715 For all students sets subject Sport cannot be followed immediately by a hard subject like Math.
 5717 Liviu and rodolforg:
 5719 Constraint two activities not consecutive (to say that the situation A1, then immediately A2 is forbidden, any
 5720 other situation is acceptable).
 5722 348---------------------------------------------------------
 5723 From Fernando A F Lordão (on forum):
 5725 I would suggest the use of the current filter values as default values when the user presses the "Add" button for constraints.
 5727 For instance, I noticed the importance of this when I was inserting teachers time constraints (SCREEN "Constraints teacher not available times"). Let me explain...
 5729 As I had many constraints already set inherited from the previous semester, I was firstly filtering by name and modifying the preferences previously saved.
 5730 At 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
 5731 times I included the constraint with the first name on the list, having so to step back and remove the wrong constraint.
 5733 I 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.
 5734 So, how about we give a hand to the brain and inherit the values from filters to the next "Add" screen.
 5736 349---------------------------------------------------------
 5737 From Benahmed Abdelkrim (on forum):
 5739 He complains that if a constraint min days between activities has consecutive if same day unselected, there can be 3 activities on the same day
 5740 (or real day, for the custom Morocco and Algeria versions).
 5742 Volker 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
 5743 if this value is true.
 5745 350---------------------------------------------------------
 5746 From aisse (on forum):
 5748 I 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
 5749 need 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
 5750 buttons are in one interface as long Their number will be small in the Algerian version
 5752 For 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
 5753 schools, primary schools, private schools ..and institutes of very different types. The constraints in the Algerian version are general to all. But when we
 5754 come 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
 5755 can all be put in one interface ..
 5757 Liviu Lalescu: So you need a customisable interface (where you can add/remove buttons from the interface)?
 5759 aisse: Not exactly .. I suggested reducing the version .. to become " FET for Algerian middle schools...The buttons are fixed.
 5761 351---------------------------------------------------------
 5762 From Benahmed Abdelkrim (on forum):
 5764 in the list of conflicts why not specify the names of hours with the days
 5765 ex: ... activity (A1) is in conflict with activity (A2) in Tuesday (2) and Tuesday (4) ...
 5767 the numbers (2) and (4) are the names given by the user at the hours.
 5769 one of the advantages of this suggestion is to know if the activities are consecutive or not.
 5771 Volker Dirr: You also need to see the duration, because you can only know then if they are
 5772 consecutive or not.
 5774 352---------------------------------------------------------
 5775 From Volker Dirr (on forum):
 5777 There 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
 5778 n_days_per_week), and other constraints, like min days between activities, which don't allow their data to be redundant (they allow only
 5779 n_days_per_week-1).
 5781 Volker suggests to allow only non-redundant data (like min days between activities constraints).
 5783 353---------------------------------------------------------
 5784 From Volker Dirr:
 5786 add a warning before generating (generate_pre.cpp):
 5787 check min days between activities constraints:
 5788 if ((number_of_activities.count() > 2*days_per_week) && 
 5789 forceConsecutive.isEnabled()) => IMPOSSIBLE
 5791 354---------------------------------------------------------
 5792 From Volker Dirr:
 5794 If there are activities in a constraint activities same starting
 5795 time and an activity is forbidden a time slot, then all the others are
 5796 also forbidden this time slot.
 5798 Liviu: It might not be critical, as activities with same starting time constraints are placed one near the other in the initial order
 5799 (problems might arise only if the user uses the advanced option "Group activities in the initial order").
 5801 355---------------------------------------------------------
 5802 From Volker Dirr:
 5804 If an activity A has preferred room R and R is not available
 5805 on some time slots, make A not available on these time slots.
 5807 (See also item #356.)
 5809 356---------------------------------------------------------
 5810 From Volker Dirr:
 5812 Take care of this potential problem: If an activity
 5813 A with duration >=2 has preferred two rooms, and in
 5814 the first hour R1 is available but R2 not, then in the second hour R2 is
 5815 available but R1 not, A is impossible to place.
 5817 (See also item #355.)
 5819 357---------------------------------------------------------
 5820 From Volker Dirr:
 5822 The order of the activities are not always good. activities with a
 5823 very low number of available slots might be much too late in the order.
 5824 (for example pseudo activities "lunch".)
 5826 358---------------------------------------------------------
 5827 From Volker Dirr:
 5829 Care about not available times if activities are consecutive.
 5831 Volker: the code might look like the attached (be careful: not tested much 
 5832 yet; so it might contain still bugs)
 5833 //NEW Variant (start)
 5834 	foundImprovement=0;	//TODO:delete
 5835 	bool addImprovement=true;
 5836 	//care about consecutive by Volker Dirr
 5837 	//TODO: same starting time and consecutive might effect each other. so 
 5838 repeat both as long as something changed?!
 5839 	//DO THIS AS LAST
 5840 	while(addImprovement){
 5841 		addImprovement=false;
 5842 		for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){
 5843 			if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_2_ACTIVITIES_CONSECUTIVE){
 5844 				Constraint2ActivitiesConsecutive* 
 5845 c2=(Constraint2ActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i];
 5846 				if(gt.rules.internalTimeConstraintsList[i]->weightPercentage==100.0){
 5847 					//if firstActivity or secondActivity has a same starting time, then 
 5848 it must be recheeckt?!
 5849 					int firstActivity=c2->firstActivityIndex;
 5850 					int secondActivity=c2->secondActivityIndex;
 5851 					for(int d=0; d<gt.rules.nDaysPerWeek; d++){
 5852 						//get times
 5853 						int firstPeriodOfFirstActivity=-1;
 5854 						int lastPeriodOfFirstActivity=gt.rules.nHoursPerDay-1;
 5855 						int firstPeriodOfSecondActivity=-1;
 5856 						int lastPeriodOfSecondActivity=gt.rules.nHoursPerDay-1;
 5857 						for(int h=0; h<gt.rules.nHoursPerDay; h++){
 5858 							int currentTime=d+h*gt.rules.nDaysPerWeek;
 5859 							if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
 5860 								if(firstPeriodOfFirstActivity==-1)
 5861 									firstPeriodOfFirstActivity=h;
 5862 								lastPeriodOfFirstActivity=h;
 5863 							}
 5864 							if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
 5865 								if(firstPeriodOfSecondActivity==-1)
 5866 									firstPeriodOfSecondActivity=h;
 5867 								lastPeriodOfSecondActivity=h;
 5868 							}
 5869 						}
 5870 						assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
 5871 						assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
 5872 						assert(lastPeriodOfFirstActivity>=firstPeriodOfFirstActivity);
 5873 						assert(lastPeriodOfSecondActivity>=firstPeriodOfSecondActivity);  
 5875 						int durationFirstActivity = 
 5876 gt.rules.internalActivitiesList[firstActivity].duration;
 5878 						if((firstPeriodOfFirstActivity>=0) && 
 5879 (firstPeriodOfSecondActivity>=0)){  
 5880 							if(lastPeriodOfFirstActivity==lastPeriodOfSecondActivity){
 5881 								lastPeriodOfFirstActivity--;
 5882 							} else
 5883 								if(lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){  
 5884 									lastPeriodOfFirstActivity=lastPeriodOfSecondActivity-1;
 5885 								}
 5886 							else {
 5887 								int numberOfFollowingBreaks=0;
 5888 								for(int i=lastPeriodOfFirstActivity+1; 
 5889 i<=lastPeriodOfSecondActivity; i++){
 5890 									if(!breakDayHour[d][i]){
 5891 										break;
 5892 									}
 5893 									numberOfFollowingBreaks++;
 5894 								}
 5895 								if(firstPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks>lastPeriodOfSecondActivity){  
 5896 									firstPeriodOfFirstActivity=-1;
 5897 									firstPeriodOfSecondActivity=-1;
 5898 								} else {
 5899 									if(lastPeriodOfSecondActivity>lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks){  
 5900 										lastPeriodOfSecondActivity=lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks;
 5901 										assert(!breakDayHour[d][lastPeriodOfSecondActivity]);
 5902 									}
 5903 								}
 5904 							}
 5906 							/*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
 5907 							|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
 5908 							|| firstPeriodOfFirstActivity>firstPeriodOfSecondActivity
 5909 							|| lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
 5910 							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 5911 QObject::tr("F1=%1   L1=%2   F2=%3   
 5912 L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity));
 5913 							}*/
 5915 							assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
 5916 							assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
 5917 							//assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity); 
 5918 // not correct that this position, correction is following now
 5919 							assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
 5921 							if((firstPeriodOfFirstActivity>=0) && 
 5922 (firstPeriodOfSecondActivity>=0)){  
 5923 								if(firstPeriodOfFirstActivity==firstPeriodOfSecondActivity){
 5924 									firstPeriodOfSecondActivity+=durationFirstActivity;
 5925 									assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
 5926 								} else
 5927 									if(firstPeriodOfFirstActivity>firstPeriodOfSecondActivity){  
 5928 										firstPeriodOfSecondActivity=firstPeriodOfFirstActivity+durationFirstActivity;
 5929 										assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
 5930 									}
 5931 								else {
 5932 									int numberOfFollowingBreaks=0;
 5933 									for(int i=firstPeriodOfSecondActivity-1; 
 5934 i>=firstPeriodOfFirstActivity; i--){  
 5935 										if(!breakDayHour[d][i]){
 5936 											break;
 5937 										}
 5938 										numberOfFollowingBreaks++;
 5939 									}
 5940 									assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
 5941 									if(lastPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks<firstPeriodOfFirstActivity){
 5942 										firstPeriodOfFirstActivity=-1;
 5943 										firstPeriodOfSecondActivity=-1;
 5944 									} else {
 5945 										if(firstPeriodOfFirstActivity<firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks){
 5946 											firstPeriodOfFirstActivity=firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks;
 5947 											assert(!breakDayHour[d][firstPeriodOfFirstActivity]);
 5948 										}
 5949 									}
 5950 								}
 5951 							}
 5952 							assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
 5953 							assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
 5954 							assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity);
 5955 							assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
 5956 							if(	lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
 5957 								|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
 5958 								|| firstPeriodOfFirstActivity>=lastPeriodOfSecondActivity
 5959 								|| 
 5960 firstPeriodOfFirstActivity+durationFirstActivity>lastPeriodOfSecondActivity  
 5961 								|| 
 5962 lastPeriodOfSecondActivity-durationFirstActivity<firstPeriodOfFirstActivity){
 5963 									firstPeriodOfFirstActivity=-1;
 5964 									firstPeriodOfSecondActivity=-1;
 5965 							}
 5966 						}
 5968 						/*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
 5969 						|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
 5970 						|| firstPeriodOfFirstActivity>firstPeriodOfSecondActivity
 5971 						|| lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
 5972 						QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 5973 QObject::tr("F1=%1   L1=%2   F2=%3   
 5974 L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity));
 5975 						}*/
 5977 //lastPeriodOfFirstActivity>firstPeriodOfSecondActivity  
 5979 						if((firstPeriodOfFirstActivity<0) || 
 5980 (firstPeriodOfSecondActivity<0)){
 5981 							for(int h=0; h<gt.rules.nHoursPerDay; h++){
 5982 								int currentTime=d+h*gt.rules.nDaysPerWeek;
 5983 								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
 5984 									notAllowedTimesPercentages[firstActivity][currentTime]=100;
 5985 									addImprovement=true;
 5986 									foundImprovement++;	//TODO delete this
 5987 								}
 5988 								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
 5989 									notAllowedTimesPercentages[secondActivity][currentTime]=100;
 5990 									addImprovement=true;
 5991 									foundImprovement++;	//TODO delete this
 5992 								}
 5993 							}
 5994 							continue;
 5995 						}
 5997 						//TODO: only if this happen each day!!!
 5998 						/*if(lastPeriodOfFirstActivity + durationFirstActivity < 
 5999 firstPeriodOfSecondActivity){
 6000 							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6001 QObject::tr("Activity %1 and Activity %2 can't be 
 6002 consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id));
 6003 						}
 6006 						if(firstPeriodOfSecondActivity - durationFirstActivity < 0){
 6007 							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6008 QObject::tr("*Activity %1 and Activity %2 can't be 
 6009 consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id));
 6010 							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6011 QObject::tr("%1 - %2 < 
 6012 0").arg(firstPossiblePeriodForSecondActivity).arg(durationFirstActivity));
 6013 						}*/
 6015 						//lock times of first activity
 6016 						for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6017 							int currentTime=d+h*gt.rules.nDaysPerWeek;
 6018 							if(h<firstPeriodOfFirstActivity){
 6019 								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
 6020 									notAllowedTimesPercentages[firstActivity][currentTime]=100;
 6021 									addImprovement=true;
 6022 									foundImprovement++;	//TODO delete this
 6023 									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6024 QObject::tr("* Lock day %1 and hour %2 of activity 
 6025 %3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id));
 6026 								}
 6027 							} else if(h>lastPeriodOfFirstActivity){
 6028 								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
 6029 									notAllowedTimesPercentages[firstActivity][currentTime]=100;
 6030 									addImprovement=true;
 6031 									foundImprovement++;	//TODO delete this
 6032 									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6033 QObject::tr("* Lock day %1 and hour %2 of activity 
 6034 %3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id));
 6035 								}
 6036 							} else
 6037 								if(notAllowedTimesPercentages[firstActivity][currentTime]==100 
 6038 && !breakDayHour[d][h]){
 6039 									if(h+1<gt.rules.nHoursPerDay){
 6040 										if(notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]!=100){
 6041 											notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]=100;
 6042 											addImprovement=true;
 6043 											foundImprovement++;	//TODO delete this
 6044 											//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6045 QObject::tr("*second* Lock day %1 and hour %2 of activity 
 6046 %3.").arg(d).arg(h-durationFirstActivity).arg(gt.rules.internalActivitiesList[firstActivity].id));
 6047 										}
 6048 									}
 6049 								}
 6050 						}
 6052 						//lock times of second activity
 6053 						for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6054 							int currentTime=d+h*gt.rules.nDaysPerWeek;
 6055 							if(h<firstPeriodOfSecondActivity){
 6056 								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100 
 6057 && !breakDayHour[d][h-1]){
 6058 									notAllowedTimesPercentages[secondActivity][currentTime]=100;
 6059 									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6060 QObject::tr("** Lock day %1 and hour %2 of activity 
 6061 %3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id));
 6062 									addImprovement=true;
 6063 									foundImprovement++;	//TODO delete this
 6064 								}
 6065 							} else if(h>lastPeriodOfSecondActivity){
 6066 								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
 6067 									notAllowedTimesPercentages[secondActivity][currentTime]=100;
 6068 									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6069 QObject::tr("*** Lock day %1 and hour %2 of activity 
 6070 %3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id));
 6071 									addImprovement=true;
 6072 									foundImprovement++;	//TODO delete this
 6073 								}
 6074 							} else
 6075 								if(notAllowedTimesPercentages[secondActivity][currentTime]==100 
 6076 && !breakDayHour[d][h]){
 6077 									if(h-durationFirstActivity>=0){
 6078 										if(notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]!=100){
 6079 											notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]=100;
 6080 											addImprovement=true;
 6081 											foundImprovement++;	//TODO delete this
 6082 											//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
 6083 QObject::tr("*first* Lock day %1 and hour %2 of activity 
 6084 %3.").arg(d).arg(h+durationFirstActivity).arg(gt.rules.internalActivitiesList[secondActivity].id));
 6085 										}
 6086 									}
 6087 								}
 6088 						}
 6089 					}
 6090 				}
 6091 			}
 6092 		}
 6093 	}
 6094 	//end Volker
 6096 359---------------------------------------------------------
 6097 From Volker Dirr:
 6099 Care about not available times if activities are grouped (2 or 3).
 6101 360---------------------------------------------------------
 6102 From Volker Dirr:
 6104 Care about not available times if students early, no gaps and max hours per day.
 6106 361---------------------------------------------------------
 6107 From Volker Dirr:
 6110 (For example 2 activities with CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY.
 6111 A1 only available at one day in the first hour and A2 is also available
 6112 at the same day also not the same hour and A1 is conflicting with A2,
 6113 then my code won't see that it is possible to disallow that hour also.
 6115 but I think that these are very very unlikely and special cases. I don't know
 6116 if something like that is in a real dataset and if it is useful to
 6117 search for such improvements, since those are more critical to detect.
 6118 This can be also improved if you care about duration.)
 6121 These constraints can still be improved.
 6123 Before computeFixedActivities in generate_pre it is useful to disallow days and hours that can't be available:
 6125 QList<QSet<int> > activitiesListWithDayNotAvailableSet;
 6126 QList<QSet<int> > activitiesListWithHourNotAvailableSet;
 6127 for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
 6128 	QSet<int> dayNotAvailable;
 6129 	activitiesListWithDayNotAvailableSet<<dayNotAvailable;
 6130 }
 6131 for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
 6132 	QSet<int> hourNotAvailable;
 6133 	activitiesListWithHourNotAvailableSet<<hourNotAvailable;
 6134 }
 6135 bool notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
 6137 while(notAvailableFound){
 6138 	setNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
 6139 	notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
 6140 }
 6143 bool computeDayOrHourNotAvailable(QList<QSet<int> > *activitiesListWithDayNotAvailableSet, QList<QSet<int> > *activitiesListWithHourNotAvailableSet){
 6144 	bool newImprovementFound=false;
 6145 	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
 6146 		for(int d=0; d<gt.rules.nDaysPerWeek; d++){
 6147 			bool wholeDayNotAvailable=true;
 6148 			for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6149 				if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){
 6150 					wholeDayNotAvailable=false;
 6151 					break;
 6152 				}
 6153 			}
 6154 			if(wholeDayNotAvailable){
 6155 				if(!(*activitiesListWithDayNotAvailableSet).at(ai).contains(d)){
 6156 					(*activitiesListWithDayNotAvailableSet)[ai]<<d;
 6157 					newImprovementFound=true;
 6158 				}
 6159 			}
 6160 		}
 6161 	}
 6162 	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
 6163 		for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6164 			bool wholeHourNotAvailable=true;
 6165 			for(int d=0; d<gt.rules.nDaysPerWeek; d++){
 6166 				if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){
 6167 					wholeHourNotAvailable=false;
 6168 					break;
 6169 				}
 6170 			}
 6171 			if(wholeHourNotAvailable){
 6172 				if(!(*activitiesListWithHourNotAvailableSet).at(ai).contains(h)){
 6173 					(*activitiesListWithHourNotAvailableSet)[ai]<<h;
 6174 					newImprovementFound=true;
 6175 				}
 6176 			}
 6177 		}
 6178 	}
 6179 	return newImprovementFound;
 6181 }
 6183 void setNotAvailable(QList<QSet<int> > *activitiesListWithDayNotAvailableSet, QList<QSet<int> > *activitiesListWithHourNotAvailableSet){
 6184 	for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){
 6185 		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY){
 6186 			ConstraintActivitiesSameStartingDay* sst=(ConstraintActivitiesSameStartingDay*)gt.rules.internalTimeConstraintsList[i];
 6187 			if(sst->weightPercentage==100){
 6188 				for(int j=0; j<sst->_n_activities; j++){
 6189 					foreach(int d, (*activitiesListWithDayNotAvailableSet).at(j)){
 6190 						for(int ai=0; ai<sst->_n_activities; ai++){
 6191 							for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6192 								notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100;
 6193 							}
 6194 						}
 6195 					}
 6196 				}
 6197 			}
 6198 		}
 6199 		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_GROUPED){
 6200 			ConstraintTwoActivitiesGrouped* c2=(ConstraintTwoActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i];
 6201 			if(c2->weightPercentage==100){
 6202 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
 6203 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6204 						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6205 					}
 6206 				}
 6207 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
 6208 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6209 						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6210 					}
 6211 				}
 6212 			}
 6213 		}
 6214 		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE){
 6215 			ConstraintTwoActivitiesConsecutive* c2=(ConstraintTwoActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i];
 6216 			if(c2->weightPercentage==100){
 6217 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
 6218 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6219 						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6220 					}
 6221 				}
 6222 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
 6223 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6224 						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6225 					}
 6226 				}
 6227 			}
 6228 		}
 6229 		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_THREE_ACTIVITIES_GROUPED){
 6230 			ConstraintThreeActivitiesGrouped* c2=(ConstraintThreeActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i];
 6231 			if(c2->weightPercentage==100){
 6232 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
 6233 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6234 						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6235 						notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6236 					}
 6237 				}
 6238 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
 6239 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6240 						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6241 						notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6242 					}
 6243 				}
 6244 				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->thirdActivityIndex)){
 6245 					for(int h=0; h<gt.rules.nHoursPerDay; h++){
 6246 						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6247 						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
 6248 					}
 6249 				}
 6250 			}
 6251 		}
 6252 		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR){
 6253 			ConstraintActivitiesSameStartingHour* sst=(ConstraintActivitiesSameStartingHour*)gt.rules.internalTimeConstraintsList[i];
 6254 			if(sst->weightPercentage==100){
 6255 				for(int j=0; j<sst->_n_activities; j++){
 6256 					foreach(int h, (*activitiesListWithHourNotAvailableSet).at(j)){
 6257 						for(int ai=0; ai<sst->_n_activities; ai++){
 6258 							for(int d=0; d<gt.rules.nDaysPerWeek; d++){
 6259 								notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100;
 6260 							}
 6261 						}
 6262 					}
 6263 				}
 6264 			}
 6265 		}
 6266 	}
 6267 }
 6269 362--------------------------------------------------------
 6270 From math (on forum):
 6272 When 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
 6273 contains general information about rooms, times of blocks, teachers, lecture titles, etc. So I can directly start with creating activities etc.
 6275 The list of teachers is quite long and encompasses both internal and external teachers. Internal teachers have a full contract with our university
 6276 while external teachers are external experts that are hired only for one specific lecture, project or seminar in that particular semester.
 6277 If 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
 6278 in one of the following semesters. Hence, only a small subset of configured teachers is actually teaching within that semester. When printing timetables
 6279 for 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,
 6280 I usually take the easier way.
 6282 So 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)
 6283 When this option is disabled (standard behaviour), FET acts like it currently does.
 6284 When this option is enabled, the list of teachers in the timetabling dialogs (Timetable -> Teachers -> ...) is filtered, so that it only contains teachers
 6285 that actually have activities in their timetables. Also the teacher list in the printing dialog (Timetable -> Print -> Teachers) is filtered in this way.
 6287 ---
 6289 Additional suggestion from math on this subject:
 6291 When selecting "Timetable -> Print" a dialog opens that has a dropdown list with potential printing types (e.g. rooms, teachers, subjects, ...). When selecting an
 6292 item 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"
 6293 and "None". By pressing these buttons I can select/deselect all items of that list.
 6295 I 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
 6296 timetable. For example:
 6297 - 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
 6298 with empty timetables)
 6299 - if pressing the "used" button in "room" mode, only rooms from the list are selected that are used for at least one activity
 6300 - 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
 6301 activities, e.g. due to internship semesters)
 6303 363---------------------------------------------------------
 6304 From pg788 (on forum):
 6306 I understand this might be restrictive, but a teacher doesn't want to begin in 3rd or 4th, since there is traffic.
 6308 364---------------------------------------------------------
 6309 From Dietmar Deuster and Volker Dirr:
 6311 Constraints:
 6312 - activity must start a students day
 6313 - activity must start or end a students day
 6315 Liviu: start may be possible, but start or end seems very difficult, maybe impossible. Please see also item #295, point 2.
 6317 365---------------------------------------------------------
 6318 From Volker Dirr and Liviu Lalescu:
 6320 Volker 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.
 6322 366---------------DONE since FET-5.40.1 2019-11-14----------
 6324 367---------------------------------------------------------
 6325 From Anthony Siaudeau:
 6327 Is there a possibility to have tags to constraints (for example to activate/inactivate a group of constraints with one click) ?
 6329 Is there a possibility to activate/inactivate activities with one click in the activities windows ?
 6331 Volker Dirr:
 6333 I 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
 6334 it 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.
 6336 Anthony Siaudeau:
 6338 I understand the risks for soft users. Is it possible to add in advanced settings an unlock button for active check boxes ?
 6340 368---------------------------------------------------------
 6341 (see also items #58, #149, and #396)
 6342 From Anthony Siaudeau:
 6344 I know an undo button isn't possible but is it possible to have a change 
 6345 history ?
 6346 When I work hard to optimize a timetable the generation time could be 
 6347 high. And few times, when I break the generation or when the generation 
 6348 is succesfull, I forget my last modification. With a change history it 
 6349 could be easier.
 6350 Maybe such history needs discusssion about the level of details 
 6351 integrated for each actions. For example said "activity n° 1234 had been 
 6352 changed" had a lack of information while "teacher alpha had available 
 6353 time changed monday hour1, monday hour 2, .... friday hour 7" will 
 6354 probably be too much detail.
 6356 369---------------------------------------------------------
 6357 From George Milliotis (Corfiot) - on forum:
 6359 I 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.
 6361 I generate schedules for undergrads, postgrads and some special course sets and I have to generate them together so the rooms/teachers work out.
 6362 Then I need to copy FET output to separate tables manually to distribute. I would like to have the ability to just output different schedules.
 6364 It 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
 6365 generate schedule html from those files. Although that would require some extra steps.
 6367 370---------------------------------------------------------
 6368 From George Milliotis (Corfiot) - on forum:
 6370 I 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
 6371 students can eat while the restaurant is open.
 6373 If 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
 6374 schedule breaks.
 6376 What I'm after are "soft" breaks.
 6378 371---------------------------------------------------------
 6379 From George Milliotis (Corfiot) - on forum:
 6381 I 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
 6382 locking 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.
 6384 I 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"
 6385 constraint is the problem. This would save me A LOT of time.
 6387 Eg:
 6388 Activity #111: Blah blah, teacher blah, students blah
 6390       this rule
 6391       that rule
 6393      this rule
 6394      that rule
 6396 For 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
 6397 is easily detectable as the culprit.
 6399 Or, 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
 6400 a time-locked activity.
 6402 372---------------------------------------------------------
 6403 From satellite2 - on forum:
 6405 FET has the option for selecting buildings of the rooms and assigning very useful constraints for the teachers/students such as min gaps
 6406 between building changes and max building changes per day/week. Our university has 3 different campuses in the city and they are really
 6407 far away from each other. Sometimes teachers and students need to visit more than one campus a week for different courses. So with the
 6408 current 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
 6409 not 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
 6410 inside each campus. I will not be able to assign min gaps between building changes since building names are used for the campus names. Actual
 6411 buildings are also needed since some of the buildings also have some distance between them on foot and at least 1 period gap is needed.
 6413 What 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
 6414 "campus" or something else? Also similar space constraint for the campus variable such as max campus changes a day?
 6416 Liviu and satellite2: maybe add each building in its own campus.
 6418 373---------------------------------------------------------
 6419 From Jude G:
 6421   *   Importing comments to activities / students / teachers.
 6422   *   Option for having full names and codes.
 6423 (so teachers, students, ..., will have two names: a long name and a short name).
 6425 374---------------------------------------------------------
 6426 From bharatstank (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3989.0)
 6428 Room not available constraint - wherein (X) crossing the specific slot means No activity is placed in that (X) slot.
 6430 Please 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
 6431 Message to display.
 6433 There are few Activities, which are not time tabled and are communicated back to the concern department by simply (X) the Class rooms slot.
 6435 375---------------------------------------------------------
 6436 From satellite2 (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0)
 6438 The 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
 6439 teacher (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
 6440 than two activities a day etc.
 6442 376---------------------------------------------------------
 6443 From Volker Dirr:
 6445 Disable energy saving mode, because FET won't calculate anymore if
 6446 the computer falls into save mode after x minutes.
 6448 377---------------------------------------------------------
 6449 From Nagendra (on forum):
 6451 https://lalescu.ro/liviu/fet/forum/index.php?topic=4050.msg21599#msg21599
 6453 I request you to enable multi-selection (using 'ctrl' key) and range selection (using 'Shift' key) in time and space constraints also. So that
 6454 anyone can enable/disable/delete many constraints at once.
 6456 Also from ChicagoPianoTuner, he suggests selecting and removing more constraints or activities at once.
 6458 378---------------------------------------------------------
 6459 From CarolStott and Volker Dirr (on forum):
 6461 - A teacher-subject matrix to enter teacher qualified subjects (so you
 6462 only need to enable/disable a cell in a table)
 6464 379---------------------------------------------------------
 6465 From Volker Dirr:
 6467 In the "Add activity" dialog:
 6468 Under the word "duration" (so left from the "active" checkbox) there is still
 6469 enough place to add some useful information.
 6470 I suggest to add the currently computed "Total duration".
 6472 380---------------------------------------------------------
 6473 From Christoph Voelker and math (on forum):
 6475 https://lalescu.ro/liviu/fet/forum/index.php?topic=4068.0
 6477 They refer to the selection mark and the colors in the constraints activity(ies) preferred times and activities occupy max time slots from selection.
 6479 381---------------------------------------------------------
 6480 From Nagendra (on forum):
 6482 https://lalescu.ro/liviu/fet/forum/index.php?topic=4085.0
 6484 Let 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
 6485 will be much more appealing.
 6487 Stage-1
 6488 Say, 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
 6489 teacher'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
 6490 highlighted, 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
 6491 drag and drop kind of thing.
 6493 Stage-2
 6494 Teacher-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
 6495 different subject. By showing both teachers timetable side-by-side and highlighting the boxes of teacher-2 upon clicking the lecture of Teacher-1.
 6497 This 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
 6498 swap requests.
 6500 382---------------------------------------------------------
 6501 From math (on forum):
 6503 https://lalescu.ro/liviu/fet/forum/index.php?topic=4102.0
 6505 When selecting "Timetable -> Students -> Days horizontal", the timetable dialog shows up. When selecting "Year" or "Group" in the dropdown combo box, the
 6506 order of entries corresponds to the order of "Data -> Students -> Years" resp. "Data -> Student -> Groups". Hence, if I'm sorting the data entries there,
 6507 the list of entries is sorted in the timetable dialog as well.
 6509 As a matter of fact, it is not possible to sort the subgroups, since they spread over multiple groups. As a consequence, the list of entries in
 6510 "Timetable -> Students -> Days horizontal" is unsorted as well, when selecting "Subgroups" in the dropdown combo box.
 6512 Would it be possible to sort the list of subgroups in that dialog by default?
 6514 If there is a scenario where the list should better remain unsorted, would it be possible to add an option to "Settings -> Advanced -> Sort list of subgroups"?
 6516 383---------------------------------------------------------
 6517 From Nagendra (on forum):
 6519 https://lalescu.ro/liviu/fet/forum/index.php?topic=4104.0
 6521 Add a constraint to limit the maximum number of subgroups (or number of students?) in any given time slot.
 6523 384---------------------------------------------------------
 6524 From Diego Froner (on forum):
 6526 https://lalescu.ro/liviu/fet/forum/index.php?topic=4128.0
 6528 I 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.
 6529 So, after all the imports, i have to set a home room for about 350~400 classes manually.
 6531 My suggestion is to add a "column" in CSV for import "years, groups and subgroups" named "home room" which would be optional. It would automatically
 6532 add the respective "A set of students has a home room" constraint.
 6534 Example:
 6536 Year ; Number of Students ; Home Room
 6537 ClassA ; 10 ; Room 01
 6539 This example will set "Room 01" as the home room for "classA" which has 10 students.
 6541 Volker Dirr:
 6543 a) 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
 6544 b) we should add all constraints in that files (not only home rooms). Similar to teachers and rooms.
 6545 c) Because a) and b) conflict each other we should add a second csv file format.
 6547 385---------------------------------------------------------
 6548 From Volker Dirr:
 6550 Split year dialog: It should be possible to sort the group names. I think manual sort (by using "up" and "down" buttons)
 6551 will be better than only alphabetic sort.
 6553 386---------------------------------------------------------
 6554 From Ireri Venture:
 6556 I would suggest you to add the constraint minimum continuous hours for a teacher.
 6558 Advantages 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
 6559 and 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.
 6561 387---------------------------------------------------------
 6562 From Volker Dirr:
 6564 there is a warning at the beginning if you generate about how to speed up by 
 6565 deleting subgroups.
 6566 in my opinion that is very useful, since guys that work with such a file 
 6567 can use it.
 6569 first of all i thought it is a nice idea if i just do that improvement 
 6570 in my source myself; so just not exporting those duplicated. but that 
 6571 idea is bad, because there is a disadvantage: it won't be possible 
 6572 to output a subgroup for every student. (only if you tell him: Mr. X, 
 6573 please use the table of Ms. Y, it is the same table.)
 6574 So what do you think about the following idea:
 6575 there should be a feature to disable those duplicates.
 6576 so FET can generate the table fast.
 6577 as soon as you get the results you just open the saved data from the 
 6578 results folder, enable the subgroups again and regenerate. By that they 
 6579 will look fine.
 6581 Liviu: It is a bit complicated, and also the constraints for these subgroups
 6582 should be the same (yes, in practice they will probably be the same).
 6584 388---------------------------------------------------------
 6586 Partially DONE in FET-5.40.0 (2019-09-25): the constraints of type teacher(s) max span per day allow one day exception.
 6588 From Luca (on forum):
 6590 https://lalescu.ro/liviu/fet/forum/index.php?topic=4177.0
 6592 Allow 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)
 6593 can have +1 more hours/span.
 6595 Additional suggestions by bachiri401: Allow a number of n days of exception for the constraints of type teacher(s)/students (set) max/min hours daily.
 6597 Also suggested previously by totera:
 6599 https://lalescu.ro/liviu/fet/forum/index.php?topic=3915.0
 6601 Several teachers can work max 5 hours daily, but only once a week; in the other days the maximum is 4.
 6602 At 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
 6603 in 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
 6604 possible pairs of days. Is there any alternative solution?
 6606 Also suggested by astigol on forum:
 6608 https://lalescu.ro/liviu/fet/forum/index.php?topic=4284.0
 6610 389---------------------------------------------------------
 6611 From Ireri Venture:
 6613 Writing a custom text (like "Break") in the timetable instead of "-X-".
 6615 There might be more break periods in the timetable. The HTML output should have a whole row/column with the name of the corresponding break
 6616 (possibly more names in the same timetable, like: "Lunch", "Supper"), written only once, and if on a column, written vertically.
 6618 390---------------------------------------------------------
 6619 From Ireri Venture:
 6621 The hours' names may be numbered starting with 1, 2, ..., and next to them, smaller, their time.
 6623 391---------------------------------------------------------
 6624 From Aisse (on forum):
 6626 https://lalescu.ro/liviu/fet/forum/index.php?topic=4283.0
 6628 Hello .. 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
 6629 so 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
 6630 bottom .. I think it would be better to arrange  it in descending order, the last constraint appears first directly under the constraint Primary.
 6631 I am sorry again because my English is not strong .. I hope you understand my idea .. Thank you for all your efforts .
 6633 392---------------------------------------------------------
 6634 From Zafar Allah Askar (on forum):
 6636 https://lalescu.ro/liviu/fet/forum/index.php?topic=4313.0
 6638 Add an option like in the custom FET for Morocco, in the Add activity dialog, a check box "Separately" for the selected students,
 6639 so that FET will add multiple activities, one for each selected students set.
 6641 393-------DONE since FET-5.41.0 - 2019-11-18----------------
 6643 394---------------------------------------------------------
 6644 From math (on forum):
 6646 https://lalescu.ro/liviu/fet/forum/index.php?topic=4343.0
 6648 I was wondering if it may be possible to introduce an active flag to teacher configuration (i.e. Data -> Teachers).
 6650 Background: beside a core team of permanent teachers we have a large team of external teachers and contracted students. If somebody participates
 6651 in 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,
 6652 because it happens quite often that external teachers return in later semesters. Even permanent staff is inactive from time to time, e.g. during
 6653 sabbaticals 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
 6654 internal ID from our SAP system. So I just want to omit the overhead of adding this information each and every semester again.
 6656 But 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
 6657 in a large list of teachers that might be significantly smaller, if only I would remove inactive teachers.
 6659 Having 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,
 6660 he/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.
 6662 The 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?
 6663 I would suggest the following:
 6664 - 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
 6665 activities for this teacher. Are you sure?" If "no" is pressed, the teacher remains active. If "yes" is pressed, the teacher gets toggled inactive.
 6666 - If FET discoveres an inactive teacher at schedule generation time, it displays a warning ("Activity 1234 has been assigned to an inactive teachers),
 6667 but ignores the inactive teacher. (i.e. it schedules the activity as if the inactive teacher wouldn't have been assigned to the activiy).
 6669 This behaviour would be beneficial for community activities, e.g. jour fixe meetings. I simply add all relevant teachers to the activity, not caring
 6670 if they are actually teaching this semester or not. By analyzing the active flag, FET would only schedule active teachers to these activities.
 6672 The other option to handle this situation would be to reject toggling a teacher as inactive while he/she has activities.
 6674 395---------------------------------------------------------
 6675 From Nagendra (on forum):
 6677 https://lalescu.ro/liviu/fet/forum/index.php?topic=4365.0
 6679 Say, activities are created with students and subjects (without teachers).
 6681 Currently, FET assigns these activities to rooms (subjected to the constraints).
 6683 Similarly, 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
 6684 the feature of assigning teachers automatically.
 6686 This way the official FET can be used for both regular as well as exam timetables.
 6688 396---------------------------------------------------------
 6689 (see also items #58, #149, and #368)
 6690 From uni_instructor (on forum):
 6692 https://lalescu.ro/liviu/fet/forum/index.php?topic=4367.0
 6694 You wrote to another request concerning this topic:
 6695 "Unfortunately, there is no Undo button, because it is too difficult to implement one now"
 6697 As I see there a a few requests related to the missing UNDO function. (my own request included).
 6698 Some users made suggestions concerning possible solutions by using powerful CVS approaches like GIT or Mercurial.
 6700 I know implementing a reasonable CVS in FET would be a tough job. So why not keeping it simple?
 6701 I 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.
 6702 But it is always a hassle and error-prone to keep all my manual recordings up to date.
 6704 So I would like to suggest a simpler approach:
 6706 FET uses internal data structures to store all basic data and planing constraints and FET can save these data structures into a .FET file.
 6708 How 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.
 6710 I 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.
 6711 Additionally 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.
 6713 Below I added some figures illustrating my idea.
 6715   Dynamic pointer array/ buffer of max n stages
 6716     \
 6717      \
 6718       \
 6719   O    \
 6720   |     \
 6721   |     +--+
 6722   +---->|#1|------|EOL
 6723         +--+
 6724          |  +-------+
 6725          o--XInfo #1|
 6726          |  +-------+
 6727          |
 6728          |
 6729          |Step 1
 6730      +---X-----+
 6731      |Data #1  |
 6732      |+---++--+|
 6733      || A ||  ||
 6734      |+---+|T ||
 6735      |+---+|C ||
 6736      || R ||  ||
 6737      |+---++--+|
 6738      +---------+
 6739           A   Current stage
 6740           |
 6741           +----Data set containing
 6742                room/activities/time
 6743                constraints etc.
 6744 ======================================================================
 6745  Data structure after #n change steps
 6747   Dynamic pointer array/ buffer of max n stages
 6748     \
 6749      \                    UNDO/Revert back to step #2
 6750       \                +---------------------------------+
 6751   O    \               |                                 |
 6752   |     \              V                                 |
 6753   |     +--+          +--+          +--+                +--+
 6754   +---->|#1|--------->|#2|--------->|#3|--------------->|#n|------|EOL
 6755         +--+          +--+          +--+                +--+
 6756          |  +-------+  |  +-------+  |  +-------+        |  +-------+
 6757          o--XInfo #1|  o--XInfo #2|  o--XInfo #3|        o--XInfo #n|
 6758          |  +-------+  |  +-------+  |  +-------+        |  +-------+
 6759          |             |             |                   |
 6760          |             |             |                   |
 6761          |Step 1       |Step 2       |Step 3             |Step n
 6762      +---X-----+   +---X-----+   +---X-----+         +---X-----+
 6763      |Data #1  |   |Data #2  |   |Data #3  |         |Data #n  |
 6764      |+---++--+|   |+---++--+|   |+---++--+|         |+---++--+|
 6765      || A ||  ||   || A ||  ||   || A ||  ||         || A ||  ||
 6766      |+---+|T ||   |+---+|T ||   |+---+|T || *  *  * |+---+|T ||
 6767      |+---+|C ||   |+---+|C ||   |+---+|C ||         |+---+|C ||
 6768      || R ||  ||   || R ||  ||   || R ||  ||         || R ||  ||
 6769      |+---++--+|   |+---++--+|   |+---++--+|         |+---++--+|
 6770      +---------+   +---------+   +---------+         +---------+
 6771                                                      Current stage
 6773 ======================================================================
 6774  Data structure after UNDO and revert to change step #2
 6776   Dynamic pointer array/ buffer of max n stages
 6777     \
 6778      \
 6779       \
 6780   O    \
 6781   |     \
 6782   |     +--+          +--+
 6783   +---->|#1|--------->|#2| -----|EOL
 6784         +--+          +--+
 6785          |  +-------+  |  +-------+
 6786          o--XInfo #1|  o--XInfo #2|
 6787          |  +-------+  |  +-------+
 6788          |             |
 6789          |             |
 6790          |Step 1       |Step 2
 6791      +---X-----+   +---X-----+
 6792      |Data #1  |   |Data #2  |
 6793      |+---++--+|   |+---++--+|
 6794      || A ||  ||   || A ||  ||
 6795      |+---+|T ||   |+---+|T ||
 6796      |+---+|C ||   |+---+|C ||
 6797      || R ||  ||   || R ||  ||
 6798      |+---++--+|   |+---++--+|
 6799      +---------+   +---------+
 6800                    Current stage
 6802 ----------
 6804 Liviu Lalescu:
 6805 	Your ideas are interesting. I added your complete post in the TODO file. Thank you!
 6806 uni_instructor:
 6807 	Nice to read!   :)
 6808 	At least it would be a possibility to implement an UNDO feature without a complete rewrite of FET.
 6810 Liviu Lalescu:
 6811 	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.
 6812 uni_instructor:
 6813 	I know, my suggested approach is not memory efficient and sophisticated, nevertheless it is a feasible approach.
 6815 Liviu Lalescu:
 6816 	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).
 6817 uni_instructor:
 6818 	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.
 6819 	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.
 6821 397---------------------------------------------------------
 6822 From Corfiot (on forum):
 6824 https://lalescu.ro/liviu/fet/forum/index.php?topic=4368.0
 6826 Corfiot:
 6828 Would 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.
 6830 This 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.
 6832 The 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.
 6834 How feasible is this?
 6836 Liviu Lalescu:
 6838 It is an interesting idea. The problem is that constraints do not have an ID, so you cannot specify exactly the constraints in a group.
 6840 But 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.
 6842 398---------------------------------------------------------
 6843 From Liviu Lalescu:
 6845 (In fact this is an anti-TODO):
 6847 Qt documentation recommends the use of QVector instead of QList. I tried on many files and indeed in many of them it improves the speed with even 10%. But for some files,
 6848 among which some from the Economics Faculty of Timisoara, it is much slower, even with 20% slower.
 6850 The file examples/Romania/Faculty-Econ-Timisoara-difficult/2007-2008-sem-2/Econ-Timisoara.fet :
 6851 	starting with random seed X=1234, Y=1234 (ending with random seed X=2061125487, Y=844641195 for FET-5.42.0 official)
 6852 		it takes 18 minutes 51 seconds with QList
 6853 		it takes 23 minutes 53 seconds with QVector
 6854 The file examples/Romania/Faculty-Econ-Timisoara-difficult/2009-2010-sem-1/Econ-v0.8.fet :
 6855 	starting with random seed X=1234, Y=1234 (ending with random seed X=48863282, Y=367996316 for FET-5.42.0 official)
 6856 		it takes 11 minutes 52 seconds with QList
 6857 		it takes 13 minutes 17 seconds with QVector
 6859 So at least for now FET will use QList.
 6861 399---------------------------------------------------------
 6862 From math (on forum):
 6864 https://lalescu.ro/liviu/fet/forum/index.php?topic=4370.0
 6866 Meaning of colors:
 6868 When enabling "Settings -> Interface -> Use colors", activities in time table dialogs (e.g. Timetable -> Students -> Days horizontal) are colored.
 6869 Do these colors have any meaning or are they selected randomly?
 6871 Liviu Lalescu:
 6873 The 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'
 6874 timetables compute the color from the subject, while for the teachers'/rooms' timetable compute the color from the subject+students' names. The color
 6875 is random, but the same for the same string (same subject or same subject+students names).
 6877 The HTML timetables with level 7 are similar, I think.
 6879 math:
 6881 Ah, ok, that's what I guessed.
 6883 The 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
 6884 an exercise, we also have tutorials, lab hours or central exercises. Hence there are multiple subjects for one course with very similar names, e.g.
 6885 "Programming 1 VL" (lecture), "Programming 1 UE" (exercise), "Programming 1 LAB", etc. I would like to see that activities with similar subject names
 6886 would get similar colors, so that it is clear on the first sight how the different activities of the courses are distributed over the schedule.
 6887 For instance, one could use the Levenshtein distance for determining the level of similarity between two subjects.
 6889 Volker Dirr:
 6891 Sadly "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,
 6892 so the names will be the same.
 6893 You might also check TiTiTo. Just import the dataset and export the table again, since you can select different colours with that tool.
 6895 A second variant is that you colour yourself by the css file with html level 6.
 6897 Liviu Lalescu:
 6899 Yes, 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
 6900 do like you suggest. Maybe you can follow what Volker said.
 6902 400---------------------------------------------------------
 6903 From Cyrus (on forum):
 6904 (see also entry #403)
 6906 https://lalescu.ro/liviu/fet/forum/index.php?topic=4373.0
 6908 Avoiding 4 sessions consecutive for teachers even when there is a break:
 6910 How 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
 6911 2 sessions followed by a break, one can only have one more and not two.
 6913 Liviu Lalescu:
 6915 I think of this: for each teacher, add n_days constraints activities occupy max time slots from selection, selected the 4 slots, max occupied = 3.
 6916 A lot of constraints to add, unfortunately.
 6918 Cyrus:
 6920 It'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
 6921 all teachers. That would be better.
 6923 Also suggested by Vangelis Karafillidis:
 6925 For the max hours continuously constraints, add the possibility to except the breaks.
 6927 401---------------------------------------------------------
 6928 From Volker Dirr:
 6930 (inspired by this paper: https://www.herrmann-online.info/documents/bachelorarbeit.pdf)
 6932 Write the rooms' free periods timetables in the HTML results. The rooms should be grouped by buildings.
 6934 402---------------------------------------------------------
 6935 From Eric de Quartel:
 6937 Is 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.
 6939 (Eric refers to writing the id-s of the activities in the HTML timetables, and maybe adding a check box for this.)
 6941 Volker Dirr:
 6943 print it in the first line or the last line?
 6945 Eric de Quartel:
 6947 Second line I think. Is very helpful.
 6949 Volker Dirr:
 6951 hmmm...
 6952 that id's might help the timetablemaker who use the fet gui. but i guess
 6953 it will only do trouble for students and "normal" teachers. those guys
 6954 can always say "in table x, day y and hour z" (of course that are 3
 6955 numbers/names, but it 100% clear. no wasting space on sheet, no swapping
 6956 id number with room number or students year, no explaining need why
 6957 there is that strange number, ...)
 6958 so shouldn't it be in the GUI only, but not in html table?!
 6960 403---------------------------------------------------------
 6961 From Cyrus (on forum):
 6962 (see also entry #400)
 6964 https://lalescu.ro/liviu/fet/forum/index.php?topic=4391.0
 6966 I have used the constrain on 'a set of activities occupies max/min slots from selection' and its amazing though tedious more so when you
 6967 have putting all teachers and classes. Is it possible we have a general constrain for all teachers and students such that it will be easier
 6968 to put constrains revolving around all teachers and students? If it can be there, it can really help alot
 6970 404---------------------------------------------------------
 6971 From Volker Dirr:
 6973 (since i am currently doing again a very difficult timetable and i think it will be useful for those very difficult tables):
 6975 optional enable in the settings "write highest stage solution if running out of generation time".
 6977 405---------------------------------------------------------
 6978 From Liviu Lalescu and Zsolt Udvari (on forum):
 6980 https://lalescu.ro/liviu/fet/forum/index.php?topic=4399.0
 6982 Maybe "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
 6983 on the screen. Maybe this should also be the behavior when the generation of the timetable does not begin because of incorrect command-line arguments.
 6984 FET command-line creates the "logs" and possibly the "timetables" directories in the output directory (which is the current working directory if none given
 6985 as an argument) and some logs files in these directories.
 6987 406---------------------------------------------------------
 6988 From Vangelis Karafillidis:
 6990 About our discussion for this feature. In real life timetabling problems, schools need to change their timetable from time to time.
 6991 It'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),
 6992 it would be really useful to preserve the day(s) of the activities. As you can understand, this is useful for already generated timetables.
 6993 So, in the same way that one locks/unlocks activities, he could additionally have the option to preserve the day(s) of selected activities.
 6994 The locking/unlocking activities, should be independent from the preserve day(s) option. In the already existing views of the generated timetable
 6995 for locking/unlocking activities, the user could be able to select the activities for which the day(s) should be preserved.
 6996 This could be done by adding already existing constraints, such as preferred time for activities (I don't remember the exact title of the constraint).
 6997 At the same time, the user should be able to remove specifically these constraints, without affecting the ones that he has added "manually".
 6998 As 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.
 6999 So, in the locking/unlocking activities views, the preserve day(s) could be added. Also, an option for removing "automatically" all these constraints
 7000 should be added. What do you think?
 7002 Liviu Lalescu:
 7004 The constraint you refer to is "activity preferred starting time". It
 7005 has a special attribute, "permanently locked" (true or false). True is
 7006 for manually added, and cannot be removed/unlocked automatically. False
 7007 is for automatically added, and will be removed/unlocked automatically.
 7009 It is possible to add a new attribute like this to the constraints of
 7010 type "activity preferred starting times/time slots". But it is a bit
 7011 complicated and will complicate also the structure of the data.
 7013 407---------------------------------------------------------
 7014 From Vangelis Karafillidis:
 7016 In the Timetable view dialogs: add a button, so the user can add an activity tag + a comment for the selected activities
 7017 and maybe add the option to modify a selected activity.
 7019 408---------------------------------------------------------
 7020 From Darren McDonald (on forum):
 7022 https://lalescu.ro/liviu/fet/forum/index.php?topic=4151.msg24155#msg24155
 7024 Darren proposes different icons for the custom versions, and other things:
 7026 I've had some thoughts about the FET app icon (both the standard and custom versions).
 7028 What do you all think about a text-free icon? (So, perhaps just the box, with a different coloured box for the custom versions.)
 7029 In any event, it would be useful to have higher resolution icons (even if the icon design goes unchanged), so this might also be
 7030 an opportunity to refresh the icon design itself.
 7032 409---------------------------------------------------------
 7033 From Francesco Rizzo:
 7035 He proposes a filter teacher combo box in the all time constraints dialog (as opposed to writing the name of the teacher in the
 7036 advanced filter there).
 7038 410---------------------------------------------------------
 7039 From bachiri401:
 7041 The 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
 7042 this might be useful also for the official FET and for other FET custom versions).
 7044 411---------------------------------------------------------
 7045 From Peter Johnson (on forum):
 7047 https://lalescu.ro/liviu/fet/forum/index.php?topic=4463.0 (Posted on 22 May 2020)
 7049 When I was using an old version of FET, I could have a "student home room", "teacher home room" and for those activities that its
 7050 teacher and student has "home room" constraint, I could define an "activity preferred room'. In this way, FET was ignoring the student
 7051 and teacher's home room constraints and just consider the "activity preferred room". But now that I have switched to the new version,
 7052 it says "Cannot generate timetable, because for activity with id==1 you have no allowed home room (from constraints students set home
 7053 room(s) and teacher home room(s))".
 7055 What 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,
 7056 but 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
 7057 other room). Is there any solution to use the new version of FET and apply this, or I have to use the old version?
 7059 Liviu Lalescu:
 7061 I 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
 7062 rooms 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
 7063 FET-5.44.7, refusing to start the generation because of conflicting home rooms constraints. (FET-5.44.7 was released on 20 May 2020
 7064 and FET-5.27.3 was released on 9 June 2015.)
 7066 Yes, 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
 7067 it, but for the moment I think it should remain like it is. It is risky to change old code.
 7069 412---------------------------------------------------------
 7070 From bachiri401:
 7072 The constraint type teacher room not available times - this constraint is available in the custom FET-MA version, but not in the official FET.
 7074 413---------------------------------------------------------
 7075 From math (on forum):
 7077 https://lalescu.ro/liviu/fet/forum/index.php?topic=4524.0
 7079 In 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
 7080 between e-learning activities, I cannot use that constraint.
 7082 I'm thinking about something like Time->Tags->"Max gaps per day/week". This way I could tag all on-campus activities and define a
 7083 maximum of gaps (=0) between them.
 7085 Or maybe Time->Activities->"Max gaps per day/week for a set of activities". Here I would define the set of on-campus activities and
 7086 define a maximum of gaps (=0) between them.
 7088 414---------------------------------------------------------
 7089 From Volker Dirr (on forum):
 7091 https://lalescu.ro/liviu/fet/forum/index.php?topic=4552.0
 7093 i 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
 7094 not available in the same slot, then also the teacher is not available in that slot.
 7096 (Liviu: Volker refers to subsequently detecting that the teacher has too little free slots for all his activities, when the user added
 7097 a lot of constraints students set not available.)