File: TODO

package info (click to toggle)
fet 5.39.0-2
  • links: PTS
  • area: main
  • in suites: bullseye, sid
  • size: 225,356 kB
  • sloc: cpp: 153,212; makefile: 6
file content (6670 lines) | stat: -rw-r--r-- 309,438 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
1----------------------------------------------------------
From Liviu Lalescu:

These are some rather technical problems, for developers, referring to some possible improvements in the generation code:

In generate.cpp, improve the stack memory for variables which are using int[MAX_DAYS_PER_WEEK][MAX_HOURS_PER_DAY]
and int[MAX_HOURS_PER_WEEK] (but be careful, I tried this and it seemed to slow down the generation.)

In the initial order, in nIncompatible, consider also teachers(students)intervalMaxDaysPerWeek, like in teacherMaxDaysPerWeek

Make students max gaps per day perfect. This is very difficult/complicated. Any bug/mistake would be critical.

2----------------------------------------------------------
From Volker Dirr:

Disable menus and shortcuts (in FET main form) if they are currently not
usable. For example: Disable teacher constraints, if there is no teacher
in the dataset. Disable space constraints if there is no room in the
dataset. (Disable means: Just make them unavailable/gray. Don't hide
them. Do it like OpenOffice.org, Firefox, etc.)

3----------------------------------------------------------
From Horatiu Halmajan:

Max gaps constraints with weight under 100%

Liviu: This is very difficult.

4----------------------------------------------------------
From Horatiu Halmajan:

Horatiu:
I met a situation: a teacher asks for maximum 2 working days, but these
days should not be consecutive.

Is there a way to implement it in FET?

The only (manual) way I could think of, is to set the teacher as
unavailable on Tuesdays and Thursdays, thus leaving him available on
Monday, Wednesday and Friday (any two of these are unconsecutive).

Any other ideas...?

Liviu:
I have another idea: add a dummy activity for this teacher, split into 2
per
week, min n days = 2, with 100%. You just need to take care that this
teacher
has place for these dummy activities (enough slots in the day) and to
consider
these dummy activities as possible gaps, so if teacher has max gaps 2 then
make max gaps for him 0.

Horatiu:
For my case, the second idea worked perfectly, as my teacher does not accept
gaps.

I have also "played" with the first with the first idea, as it seems to be
the most un-restrictive one. It also worked. I tried it three times, and in
all three situations at least one of the dummy activities was the first or
the last activity for the teacher's day. So, there is a chance that the
teacher would end up with only one gap.

Which leads me to a suggestion: An activity ends (or starts) a teacher's day.
Similar to "an activity ends students's day".

5----------------------------------------------------------
From daviodan:

I will refer to sample_Brazil_more_difficult_max_2_gaps_for_teachers.fet

1. In the FET activities dialog there exist more filters after the teacher, group, etc.
If we choose for instance the subject "Math" and we do the filtering also after the name of 
the teacher, then the list of the filter should contain only the name: Bruna,Silvania,Wellington,
because only these teach Maths. In the present moment the filter contains the list of all teachers.
The same for all the other filters.

2. In the teachers' statistics dialog, when we click a teacher, there should appear in the right
in a box all the constraints for this teacher inputted by that moment.

6----------------------------------------------------------
From Volker Dirr:

for code cleanup always use the same style:
some constraint c have
c->teacher_ID
others have
c->teacher_Index

7----------------------------------------------------------
From Azu Boba (modified/updated by Liviu Lalescu):

About timetable view teachers: ... I propose is to 
have fixed cell height and width so it would be easier to comprehend and 
pinpoint what you see when switching between teachers. 
We have a 3D table (teachers/days/hours). I propose to 
add a new view named e.g. "View (day for teachers)" (of course you keep 
the "View (teachers)" too). This view will be similar to "View 
(teachers)" but it will have all the days as selectable tabs on the top. 
The 2D table it will display below the tabs would be the Teachers/Hours 
view for the day selected. The buttons and functionality will be the 
same as in the case of "View (teachers)". ...
The best part though is that with this 
new View you will be able to better comprehend/modify the schedule in a 
day by day base...
You might also want to consider adding an additional flag when locking 
an activity. This flag might be called "Save data and timetable flag" 
and would be set when an activity is locked automatically during the 
"Save data+timetable as..." procedure. Why? Mainly, because when you 
want to unlock e.g. a specific day in a "Save data+timetable as..." 
saved timetable you do not want to unlock all the activities of the day; 
you want unlocked only the ones that were locked by the "Save 
data+timetable as..." process. There are activities that the schedule 
creator manually locked them before FET generated the table (e.g. a 
specific lesson needs to happen only on a specific day and time). By 
selecting and unlocking a whole day as things are now you unlock these 
activities too! This means that if the schedule creator doesn't pay 
enough attention he might mistakenly create a schedule with activities 
set at undesired hours. The solution I propose to this is to toggle 
between locked/unlocked only the activities that have the "Save data and 
timetable flag" set. To unlock the manually locked ones the user would 
have to do it in a different/manual way (see the paragraph below about 
the editable "Details" box) or even better be asked with a message box 
if he wants to unlock the manually locked activities too.
I also mentioned that in order to remove a teacher from a specific day 
(because he is ill or on a leave) I have to go to "View (teachers)" and 
pinpoint all the activities assigned to the teacher for this day 
(checking their IDs from the "Details" text box and then writing them 
down in notepad). Then I close this view and go to the "Activities" 
list, find the specific activities and uncheck "Active" for them. This 
is a little annoying and a prone to errors procedure especially if there 
are more than one teachers missing. What I thought as a solution for 
this has to do with the "Details" text box on the "View (teachers)". It 
would be great if it wasn't just a simple text box but an editable 
interface for every changeable value. What I have in mind is to split 
the "Details" into two parts; the upper part would include all the non 
editable values while the lower part all the editable ones. Right now 
for me, only the "Active" and "locked time" values are worth of being 
editable, so  simple check boxes would suffice but someone else might 
want other values editable too (e.g. Total number of students, duration) 
or new values worth being editable might be added in the future, so it's 
a good thing to have.
Last but not least (and certainly the most difficult modification) it 
would be great if you could drag and drop activities in the "View 
(teachers)" and "View (day for teachers)" GUIs. Of course by doing so 
you create conflicts and this will need handling. But I think all the 
before mentioned changes are enough work for you now and I need to think 
this a little more to come up with a viable solution.

8----------------------------------------------------------
From Marco Barsotti:

The only thing that I would like to find in a future version of FET is the
ability 1) to find when a combination of constraints is impossible to
respect. 2) to recognize which constraints generate a bottleneck, where FET
stand by searching the little hole where to pass and go on, placing
activities.

9----------------------------------------------------------
From Saad (on forum):

Manual improvements of the timetable.

10---------------------------------------------------------
From Volker Dirr:

Change remove redundant to deactivate redundant.

11---------------------------------------------------------
From Volker Dirr

I got reports from a user that he had trouble to find the correct
output files today, because there were so many files in the directory.

just maybe:
maybe write only the index file into the result directory. then make 3
subdirectories. one subdirectory with all html files, one with all xml
files and one with all csv files. so we don't need the export menu
anymore, because it is exported always by default and the directory is a
little bit more tidy.

12---------------------------------------------------------
From Volker Dirr

We have:

1. category: 3-4 classes
2. category: 5 courses
3. category: 4 religions (always same time, so i didn't enter it)
4. category: several working groups (after noon lesson, so i add them
manualy)

Now have a closer look:
4 classes * 5 courses * 4 religion is already 80 subgroubs.
so if i also add working groups (lets say 5, but there are more!)
then we have total 400 subgroups.

that is stupid, because i have only around 100 students in a year!

i think in that case it is wise to enter data not in groups, add
students
individual.

that is like high school do it.

- add a year.
- add groups (NOT with split year, but same names)
- add a group ALL STUDENTS.
- add subgroup with all students names into ALL STUDENTS.

- now we need a table to every year:
	- horizontal are the division names (must not be group names, but
	can)
	- vertical must be the student names
	- every cell is a bool checkbox

no the timetablemaker can check every single student. of yourse by
checking the studentsname must be added as subgroup into that group.

13-------------------------DONE----------------------------

14---------------------------------------------------------
From more users:

Multiple processor - split multiple timetable generation on multiple processors

15---------------------------------------------------------
From Volker Dirr

how about displaying "minimum home
room hours" and maybe also "maximum special room hours" in the teacher
statistics? because a timetable maker (maybe) need that for his
planning.

16---------------------------------------------------------
From Danail Traichev:

You see, this division in subgroups is very complicated - to understand 
and to add by hand. And at the end you came with a lot of subgroups that 
have only formal sense, for the algorithm, but are visible in dialogs, 
in the final chart and everywhere. It should not be like this. One will 
have to divide years in wizard-like dialog, with questions:
1. How many classes you have for this year?
2. Define courses for which students from this year study together
3. Which of these curses start at same time. Group them by this criteria
4. Define from which classes came students for these courses. Whole 
class is caming, or only part of it? Where other part goes - have rest, 
or has another activity, and if yes - which one?
5. Define teacher that is teaching in every course.

This is a draft, but some wizard like this will save *a lot of* 
mistakes, and will make program much more user friendly. Then you can 
add internal groups, but not show them to users, or at least show if 
they set some option. Show them only groups and subgroups that they need 
to put in activities, and show these same in final html output.

This is my opinion of user in trouble :-)

Second set:
1. Ability to select more than one constraint and delete it, or set its 
weight
2. Ability to disable all informative and warning messages, or to display 
them in status bar or in another log window.
3. Option to remember last focused control in dialogs - very useful if 
you want by keyboard to open many constraints and change their weight
4. Constraint "longest gap is n hours"
5. A way to save last generated timetable and reopen it again (for example 
for printing it with different html level, or for viewing it.
6. Ability to show free teachers for every position in students and 
teachers timetable - very useful if you want to find somebody to replace you

17---------------------------------------------------------
From my80s:

also in program we have
a matrix with days x hours = n x n
if this is allocated from some activity it should get error in
precomputing in real time
if we put another activity 100% in same cell

that would take less time to find mistakes

18---------------------------------------------------------
From my80s:

export as odt (OpenOffice.org) table (spreadsheet)

See also TODO item #310

19---------------------------------------------------------
From Danail Traichev:

If you make it how it is now with years, groups and subgroups, it will not
be complicated for entering and even will not need change in most
constraint dialogs. What I mean - define "groups of subjects", and allow
"group of subjects" name to be used in every place where subject can be
used. Much  like it is now with student sets - both student years, groups
and subgroups are placed in one control and added from one place.

But of course, I don't know how this will fit with FET internals. And FET
is fine even without this. It simple will make entering constraints a bit
easy. The other posibility is if every activity constraint dialog has a
posibility to select multiple activities, and to filter them by "subject
group", or at least by "selected subjects". That will make entering
constraints like in my case easy.

20---------------------------------------------------------
From Volker Dirr:

maybe it's possible to do Form::setLayoutDirection(Form::LeftToRight) only to the filename or language in menu.
(bracket bug in Arabic translation)

21---------------------------------------------------------
From Volker Dirr:

I saw at Les's timetable, that he called hour==period.
also at wikipedia it´s called period. (see School_timetables chapter, terminology)

I am not sure about that. in German we have the also the word "periode",
but we don´t use it for timetables. we say hour.
but maybe that´s just colloquial language. this colloquial language is ok,
because the schools have 1 schoolhour (45 minutes) or 2 schoolhours (90
minutes).

but maybe it´s better to use also the word periode, because by this
schools with 60 minutes activities (2 periods) and 90 minutes activities
(3 periods) don´t get trouble with the word hour (because it entrap /
ensnare /
inveigle so write 1 hour and 1,5 hour. but "hour" is an integer values!

but on the other hand people (maybe) will not understand immediately the
word period.

so maybe we should write "period (hour)".

22---------------------------------------------------------
From Volker Dirr:

maybe change "current constaint" into "description", "constraint
information", "description of the selected constraint", ... (very very low
priority, maybe one day)

23---------------------------------------------------------
From Volker Dirr, regarding translation:

1. maybe it's better to be more exact. example: phrases "min hour" better "min hour per day"

2. sometimes the english version isn't always the same.

sometimes you wrote "add current activity"
sometimes you wrote "add activity"
sometimes you wrote "add current"
sometimes you wrote "add"
i think it should always be the same.

also sentence like: "You have to know that this constraint ..."
should only be: "This contraint ..."

3. maybe "start" should be "generate" in the generateform.

4.	- if you wrote one or more sentences, please always end with ., ! or ?.
	- sometimes you wrote "students subgroups", i think you just need to write
	"subgroups", because teachers have no subgroups.
	- all "add", "modify", and "remove", "close" phrases should only contain
	this word. no more words like "current" or "group". maybe wrote them with
	QObject, because nearly every dialog have this 4 phrases.

5. i think we should think and write a small definition note for english
phrases.

it looks like in a few times this terms are not always used same/correct:
hour
duration
period
lesson
activity

when we write a small definition note, then we have to care about this:
words must also be correct for schools that don't use "hours" as one time
hour.
in Germany one school hour is 45 minutes. but that's no problem. we use the
same words for that.
but i remember a letter, a user wrote that he has 60
minutes hours and 90 minutes hours. so he defined 30 minutes "hours" and
set duration == 2 or duration == 3 to the activities.
so the definition and use of hour, duration, period and lesson must also
match to this.

please let us first a small definition not for this terms:
hour, duration, periode, lesson, activity
this will help if we add new or modify old english phrases and it will
also help translators.

6. maybe: no brackets in "view (students)", "view (teachers)", and "view
(rooms)".

7. and it looks like we shouldn't use the word "lesson".
in the most phases it's better to replace "lessons" by "subactivities"

8. that is also why i already asked you to change english translations,
because some phrases can be shorten.
for example all sentences with "you", "current" or "that mean" can be
shorten (in english and german).
example:
"If you insert current group to current year, that means that some years
share the same group (overlap)"

shorten version:
"Some years share this group if it's inserted."

9. and a maybe other thing. example:
view in fet-mainform.
there is "Time contraints (techers)".
and in this folder is for example "Teachers max gaps per Week".
i recommend to write just "Max gaps per Week".
Reason:
- it's shorter
- it's clear that it "teachers" contraint, because it´s in that folder

the English version looks fine, because you are always possible to write
first "teachers". (except on min days between activities. You
are not able to write Activities first.)
In German translation it is much more difficult the write "teacher" always
first. even including the word teacher is a much longer phrases than in
english. it will be much easier and nice, if we don't write teacher here.
maybe the same problem in other languages.

24-------------------------DONE----------------------------

25---------------------------------------------------------
From Volker Dirr:

For multiple generation:

Maybe add a checkbox "shutdown after job is done".

26---------------------------------------------------------
(see also entry #194)
From Volker Dirr:

long time goal: code cover planning.

27--------------------------------------------------------
From bmlahcen13:

for that i advice to start thinking from now to
- enhance the UI
- use Database
- add web client
- use UML models

and also for the structure, use "int id", this will
enhance both runtime and will reduce the storage,
because in the FET xml files, for example to store and
activity, you have to write again the name of the
subject, teacher, students and also the day and time
slot in a solution. the same happens in time and space
constraints, these 3 entities represent a big
percentage of the size of the file, so you use int IDs
and not names you will certainly gain a lot of space
and also a better execution time, i know, as you said,
that the internal structure uses int id but for
loading and saving xml files and searching, the usage
of strings delays them.

Liviu: maybe it would be better to compress the input file

28--------------------------------------------------------
From more users:

Improve the user interface - add help and wizard.

29--------------------------------------------------------
From Michael Towers:

What about a rewrite of the front end in a scripting language - e.g. Python? It might speed 
development and help debugging. It could also make maintenance of the code easier.

Is there some way of doing "interactive" timetable development? The human would make 
suggestions, or place some items, run the program, maybe move a few things around, run the 
program again ...

A clear and clean interface to your engine as an entity separate from the 
input/output might be useful.

It seems to me, it should be possible (but of course only after a lot of work!) to have 
a beautiful manual timetable editor (which can also print the various timetables, and 
perhaps save the data sets and results in a database) with an interface to an automatic 
timetable scheduler which can be used to speed up the work."

30--------------------------------------------------------
From TheStar:

A constraint to think about is that some activities, and I suspect 'normal school management'
talks about teachers as in "One teacher per x students".

In the HSC year here, it's about one teacher per 26 students (or something like that).
At a recent excursion, it was one teacher per 10 students.  Hope that helps :)

Liviu Lalescu: Of course, you can add each student. I could have implemented this solution.
But I doubt that the user has such patience.

You could always autogenerate the students...
"Quick-Build Students"
[Properties]
[Number]
(Build)

And it will generate students with name: AutoGen-11231, ID: 11231, and the like.

The user could then 'select' groups of these students... and... (Just an idea)

31--------------------------------------------------------
From Abdul Hadi Kamel:

Do you have a plan in mind to upgrade the existing fet from standalone
application to a client-server/web-based database oriented type of
application in the future. This is because the current fet is quite limited
especially in terms of timetable data which cannot be keyed-in /view s
amongs several users at the same time. This will cause hardship because the
people involved in making the class timetable in universities normally
consist of several key persons from different departments. Using standalone
application by several persons sometimes make data consolidation process
among departments become difficult and error-prone

I think it will be better if the FET can support a single timetable data
repository (using client-server model) in a database that can be input/view
by several users simultaneously.

32---------------------------------------------------------
From Volker Dirr:

If you think that other people don't like this default constaint how about
making a menu "default settings". there you can add "language" and my
default wish. maybe there are other parameters, that can be set in this
settings. I guess that there a people who want set duration to 2 or 4 by
default.

33---------------------------------------------------------
From kdsayang:

I would like to see FET generate the time table in

1. certain amount of time for each time table
2. with some setting about the remaining weight soft conflicts
3. generate multiple variants

For example
(A) rules are
(i) the user select to generate 10 minutes time limit for each time table
(ii) user set 0 for remaining weight soft conflicts
(iii) the user select 10 variants

the outcome
(B)
(i) the time table finished and it has generate 10 time table that concur with 0 remaining soft conflicts for each time table
(ii) the time table finish and it only manage to get 5 variants from 0 remaining weight soft conflicts
(iii) the time table finish BUT it don't manage to generate any variants with 0 remaining weight soft conflicts

refer to (B)(iii)

the user can change
(i) longer run time to generate time table (with crossing finger) hehe... Others setting is not change
(ii) longer run time to generate time table with increasing value for remaining soft conflicts (0.5, 1.0, 1.5 etc)

As you can see in timetable --> generate multiple variants, features in (A)(i) and (A)(iii) are already there. I hope that you 

can figure it out on how to implement the feature in (A)(ii). It would be marvelous.

34---------------------------------------------------------
From kdsayang:

If a user want to add "an activity have a set of preferred rooms", the user will need to click one 
by one to add right???... So, I would like to suggest that we group them like when user want to add 
an "activity". There (activity), we can select by years, groups and subgroup for students. Instead of 
clicking all the student groups in years 1, user can just click year 1 to include them all into students....
 
For example for rooms (room group then room subgroup)
 
HALL
Hall A
Hall B
Hall C
 
TUTORIAL
A-A1
A-A2
B-A1
 
COMPUTER LAB
Lab 1
Lab 2
Lab 3
 
So when user want to add "an activity have a set of preferred rooms" for all the tutorial room, instead 
of clicking 20 tutorial room one by one, user just click the group that is Tutorial. Easy right???

35---------------------------------------------------------
From kdsayang:

What I meant is in Data --> Time Constraints --> Teacher Time Constraints --> A Teachers not available time, 
1. If you double clicked Afida, 
2. It will show Afida not available time right. 
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. 
4. So, if you want to change Sambilan not available time, you have to clicked Cancel button first, 
5. then double clicked Sambilan. 
6. Now you can see that Sambilan not available time is updated.

My suggestion is that It will be better If FET can update to Sambilan from Afida in Step no 3. 

36---------------------------------------------------------
From kdsayang:

I have some other suggestion.
 
1. It will be GREAT if FET can be turn to tree structure. We can show/hide the structure
2. In the tree structure, we can use the copy, cut and paste to edit the subject, activities, etc in the tree structure

37---------------------------------------------------------
From kdsayang:

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.
 
So, I suggest that you can add a set of teachers not available time. Same as rooms not available time feature.

38---------------------------------------------------------
From kdsayang:

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

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.

This feature is needed if my/our/your university/school is a big one where teacher and subject are hundreds.

39---------------------------------------------------------
From Zsolt Udvari:

We've created a timetable but the rooms aren't. So we do it by hand.
How can I change in FET the rooms simpler in a generated timetable?
The times are locked.
It would be the most simplier when I open e.g. the teachers timetable,
click on a activities and I can add room to this.

Liviu:
I'm sorry, but you'll have to add manually constraints activity preferred
room for each of the activities.
I am not sure I understood correctly the problem, if not, please excuse me
and explain more detailed.

Yes, imho you understand my problem. I hoped that there is a simpler
solution. So, maybe in the next releases would be nice: when a
timetable is generated, user can changes/sets the rooms (only the
activities without rooms of course) from the timetable (Timetable ->
Show teachers/students): you select an activity, you click a button
with "Assign room" and choose a room.

40---------------------------------------------------------
From Naji:

Hopefully, FET's team can enhanced it to be able to export the xml data to database, that will facilitates the
output of the data and enables programmers to engage it with their programs.

41---------------------------------------------------------
From Massimo Mancini:

This is a request for a new feature...
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:
Theacher:  MANC, MANCINI
Subjects: MAT, MATEMATICA

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.
I wish to output the brief (only BD) or complete (LD) timetables

42---------------------------------------------------------
From jaspal:

INSTRUCTION FOR ALLOTMENT OF SUBSITUTION/ ARANGEMENT PERIODS

On a particular day, faculty can be on leave, or may be busy with some 
other work hence unable to take the assigned classes. Thus, the classes 
taken by those faculty members are to be assigned to some other faculty 
members.

Facility of keeping track of back log periods due to absence or 
unavailability are to be recorded year and group wise in the software. 
Also extra periods taken by the faculty has to be recorded year and group 
wise.

43---------------------------------------------------------
From ßingen:

For the internal organization of my school, it's convenient to have a general timetable for each
group, A and B, and our timetabling software gives it. But as you observed, the footnote legend
style it's not probably the best, as it's a little bit difficult to understand. I think in FET a good
solution could be to be able to define a group of activities for a group (for example A, or even the whole
year A and B), and then subdivide this group of activities in many subactivities, each of them
with its own teacher and classroom (I have read the term "subactivity" in the manual, but I
can't find a definition of it, nor find it in FET menus). So a group would be attending many
activities at a time, which is not possible right now in FET. Maybe if it represents a structural
problem FET could define internally subgroups, but being transparent for the user. This activity
group should have a user defined name to identify (for example "Optative 1"). And then inside,
each subactivity would have the real subject ("French language", "Arts", etc.). In this way the
user would avoid to define such a great number of subgoups, and in the teacher's timetable
everything would appear right and clear, with no reference to the activity group, just to his own
subactivity, and with information of room besides of the group (opposed to the pseudoactivity
solution to book the room).

In the group timetable, the common activities would appear as always, and the others would appear
with the activity group name. Then parallel timetables with blanks in the common activities and
one of the subactivities for the rest could be printed . So we would need as much timetables as
the maximum number of subactivities of the largest activity group. Maybe the subactivities could
be diplayed in couples to avoid many timetables, as it happens now with group timetables and
"same day+hour" activities.

These parallel timetables could be hanged up on the classroom board, and, of course, each pupil
should know which of the subactivities has to attend. I think this display should be clearer than
the footnote legend style. I don't know if I have explained it clear enough, but if not I could
send a spreadsheet with an example.

Also, with this solution, if no activity group are defined all works as before, so we would avoid
the problem commented by Liviu of people not needing it.

44-------DONE since FET-5.19.0-(10 January 2013)-----------

45---------------------------------------------------------
From Massimo Mancini:

SUGGESTION BY: Massimo Mancini

WHERE: add activity form

WHAT: a check box to lock the total duration of activity

WHY: to introduce an automatic check and alert on the sum of durations of
single subactivities (currently the total duration reflect always the sum,
so if you alter the single duration, FET recompute the total, this can be
what you want or maybe not)

WHEN: all new future are always ASAP :-D (the programmer says...)

FURTHER DEVELOPMENTS: a templates system for automatic generation of activity based
on year and subjects expected for a class of that year (normal italian
situation, abroad I don't know ;-)

46---------------------------------------------------------
From ßingen:

- 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.
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
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.
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"
then I can not define the surveillance activities.
- 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".
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.

47---------------------------------------------------------
From T. Renganathan:

You can include a provision for multiple selection of subjects, teachers,
activities, etc., for example using Ctrl or Shift key. This will especially be useful for deleting
multiple entries.

48---------------------------------------------------------
From Volker Dirr:

Volker:
if i am in FET->Data->Subjects
i can't see at the right side all constraints.

in my latest samplefiles for example the "a set of subactivities has a
set
of preferd time slots" is missing to that subject.

also in FET->Data->Activity Tags are not all constraints displayed.

Liviu:
Yes, I know, because these are related to activities. I chose not to show them.

Volker:
please add in TODO. i think this is a nice feature we should not forgot.

Liviu:
I thought about your proposal. I think it cannot be done and I know the reasons why I didn't do that: 
a constraint activities preferred starting times has subject "" or specified. If it is "", then it is for 
all subjects. So, I should write all constraints of this type with subject "" for each subject. But this 
is not correct. A constraint might have a teacher who doesn't have this subject.

49---------------------------------------------------------
From Volker Dirr:

by the way we should add a new tests before generating a timetable:
if 2 activities are grouped, then turn of min n day constraint of that
activities.
if 2 activities are consecutive, turn of min n day.
if 2 activitives have same starting time, turn of min n day.

or the opposite, bedending on what has a higher weight.

maybe instead of turning of maybe just warn the user that this two
constraints are not acceptable at the same time and tell him he should
care about that problem first of all (by removing or reducing weight to
0%).

50---------------------------------------------------------
From Les W. Johnstone:

Hi Liviu,

I'm into the thick of it again scheduling...
now working on two different schools...

Sacred Heart College is not a problem since they use a five day blocked
schedule. Saint John's College though is a slightly different problem...

They have a five day AB schedule...

which means I entered two activity groups... one for week one and one for
week two and used different activity tags... w1 and w2 to keep things
separate, with specific rules of placement of w1 in Week1 and w2 in week
2...

However, your spacing feature doesn't work ... not on more than five
days.... not sure it would be possible to extend your logic or not... (what
do you think?)

The other thing I've noticed is a bit of an annoyance concerning
constraints... when you are trying to get a schedule to work you push in
constraints however, on slight modification of activities (concerning
resources etc.) sometimes, what was once soluble becomes insoluble.

Usually this means you have to relax constraints in order to get the
schedule soluble... some (most) can be set to a 0% weight which means they
are ineffective.. then later you can turn them on again... however, some
rules are only acceptable at 100%... which means you need to drop them from
the constraint set...

but the constraint may be important and be forgotten to reimplement...
could you set an active/inactive flag for constraints like you have for
activities... so it can later be reimplemented?

51---------------------------------------------------------
From Chafik Graiguer:

Liviu:
There is no easy way to remove a component.

Chafik Graiguer:
well
to re-use  last year .fet file,
what about
-removing all activities at once, so Data keeps only subjects, teachers and groups ?
or
- removing all teachers from all activities (because teachers dont teach the same groups every year)
or
- removing all groups from all activities

Liviu:
I just looked in the sources and it seems that in statistics I only count active activities. Please verify that, though.

Chafik Graiguer:
yes !
and I spend nealy ONE hour counting periods for teacher  Eng1!!
in Statistics, teacher  Eng1 has only 20 hours
in Data  ---> activities, I count 21 hours :-))  for him
finaly, I realised that I has deactivted one hour component by mistake

so, is it possible to add this line into activity window:
Quote:
Activity:
Teacher=fr4
Subject=fr
Students=2Lg -1
Id=1
Activity group id=1
Duration=1
Total duration=5
Total active: XX
Active: yes
Total number of students=0 

-----------addition:
Chafik Graiguer:
- removing all groups from all activities
sorry, removing groups does not make sense, because, activities should keep group's information
Groups have the same set of activities every year

So the most important is:
-removing all activities at once, so Data keeps only subjects, teachers and groups ?
but this is not so good, as we will lost time and space constraints related to those activities
So, the best of the best is:
- removing all teachers from all activities (because teachers don't teach the same groups every year)
so we can re-assign new teachers to groups

52---------------------------------------------------------
From Massimo Mancini:

Consider this:
1. I inspect the activities of a teacher (via filter on teacher)
2. I see the lack of an activity (or I delete one or more filtered
activities because I want redefine them)
3. I push the add buttom... why the subjects aren't
only those that teacher teach?

A more general question... why not associate in advance the teacher with
his students and with the subject he teaches? In this way I could obtain some
type of automatic filter.
If I add an activities of mines I select MANC but MANC teach MAT in GEO_1B,
GEO_2B, GEO_3B and IGE_1A. The program should be aware of this.

53---------------------------------------------------------
From Massimo Mancini:

When I review generated timetable with view (teachers) menu option I can lock/unlock
the placed activities and this is ok. But why I cannot do the same for
empty cell? The meaning of locking an empty cell should be to add/modify a
Teacher not available constraint or something that have the
same effect... so a new generation leaves those positions untouched.

A I said I would to lock/unlock some students or some teacher and
recalculate the rest.

54---------------------------------------------------------
From Frans Cilliers:

About campuses: What I thought is the following. Currently you have min
gaps between buildings and maximum building changes per day. If this can
also be done for campuses, for example minimum gaps between campuses for
teachers. (An extra constraint but it will probably be to difficult as
you mentioned)

55---------------------------------------------------------
From K:

Maybe you remember my post from April (many teachers – many groups). Since
than in our team we’ve been trying to adapt our internal solutions to use
FET (it is really your great success).
We tried to use FET to solve timetable for a pretty big plan and by the
way we had to solve a few problems and got some experiences as an
end-users. Maybe it would be interesting also for you.
...
    The third problem was to export data from the program we use for planning
(a database application) to FET and than import data back. I pre-assumed I must
enter data to the FET automatically as the number of activities and
constraints is too high to handle them manually. Also a plan generated by
FET had to be automatically imported to our database. I used FET
procedures to import teachers, students and rooms. I also tried to use
FET import procedure for activities too but I had a problem with IDs. FET
generate its own ids but I needed to use my own ones to keep link between
data in the database with those in the FET so finally I decided to
generate input file instead. Fortunately FET doesn’t change ids and
generate perfect XML file with generated plan and
thanks to known ids I could import data from FET to our database with no
problem.
    The next point. Due to number of constraints we have in our database I
used similar procedure to generate a part of FET input file with teacher
time constraints and room time constraints. Hence I have a question.
Would it be possible to include file path into FET input file to keep
data in a couple of separate files as working with 100 000 lines file is
not fun?
    We prepared the whole procedure for timetabling with FET. First we
planned (in the database program) activities for VIPs manually. To use FET
we also had to put into the timetable all activities where students from
one group could choose one activity from a several ones (languages and
some lectures) at the same time. That is why in the input files are so
many “permanently locked” activities and activities with many groups and
only 10 students to avoid conflicts with room capability (I used
<Activity_Tag>UL to mark them). Together with these activities we locked
a room by preferred_room constraint. After that I included prepared data
to the FET input file and after all we started to generate
the plan. Fortunately FET is smart enough to find mistakes in locked
activities (room and time conflicts) so than we removed conflicts for
already planned activities.
    By the way – during reading the input file I noticed the error
that rises when the number between tags:
<Number_of_Not_Available_Times>NUMBER</Number_of_Not_Available_Times>
was  not exactly the same as the number of constraints in the file. Of
course it is not a bug. It never happens if user use FET to input
constraints. But it forced me to count constraints during generating data
and shows that program is rather “sensitive”.
The first hint for other users is to start with minimum number of
constraints and if FET would generate the plan than thinking about adding
the next ones. In TODO file I found the suggestion of “possibility to
disable constraint without removing it. Such 'Active' checkbox like on
activities dialog”. I admit – it would be nice. Moreover finding a good
plan is just like using 10 knobs increasing one constraint and decreasing
the other so fast access to the constraints window is crucial. I suggest
to put “Time constraints” and “Room constraints” buttons also in the main
menu (or creating any other shortcuts) as these constraints are rather
deep in the menu.
The next suggestion is to change the interface for some constraints
(particularly wherever there is a long list). For instance for the
constraint Max day for a teacher per week if we have many teachers a
simple table like:

| Teacher Name | Max days|
| teacher 1    |     n   |
| teacher n    |         |

with a button “Save all changes” would be great. Now we have to enter
value for every teacher one by one in separate windows.
    After setting constraints we tried to generate the next version of the
plan. We added more and more constraints (for instance WOLNE – dump
activities - free day for student or increasing max day for teacher) and
I was really surprised when FET coped with that. It took from about 1,5
minutes (almost no constraint) to over 20 minutes (with many constraints).
With too many constrains after
about 10 minutes when I saw no change in the number of placed activities
(neither up nor down) I cut simulation, removed some constraints and
started it over.
    The second hint is not to change too many constraints in one simulation
as it may lead to impossible timetable and than it is difficult to say
which particular constraint was too much.
    Of course there is a lot of work to do. For instance even when two
consecutive activities are placed at one day (the same group and the same
teacher) sometimes there are placed at different rooms what would force
them to needless changing room. I guess that FET is focused on fulfilling
constrains but not on optimizing timetable. Sometimes simple changing of
two activities makes plan better both for students and teachers. I think
that manually improving generated plan is faster than creating many many
more constraints and repeating simulations. And this is the third hint.

56---------------------------------------------------------
From Chafik Graiguer:

When a user click on Data ---> activities
he is presented with a list of all activities because filter fields are empty
all activities are listed based on Activity Id
Now, is it possible to a add sort feature like this
Sort by:
	Teachers
	Students
	Duration
	Subject
	Act Id
	
So for example, if you select teachers, all activities will be listed alphapetically in a ascendent order

57---------------------------------------------------------
From Massimo Mancini:

In advanced lock/unlock I would lock/unlock on teachers basis (with pick up
the teacher from list of teachers) or on students groups basis (always from
a list) The lists are mentained from subsequent generations and saved with
data.

58---------------------------------------------------------
From Massimo Mancini:

I have another suggestion: an history file where you record all the actions
of the timetabler and theirs effects. If the history was visible in a a frame
in the View timetable forms, I would see scroll the messages without interruption
and with the opportunity to review them (please don't answer that is too
complicated... you can use a tab widget, a tab for the current situation
another for history... the right answer is: GREAT! I add it in TODO! ;-))). 
In general an history file should be a great thing and the base for
undo/rollup features.

59---------------------------------------------------------
From George Milliotis:

I propose the ability to sort constraints by:
1. Type [so single ones - ones that you can't add twice - go to the top]
2. ID of activity
3. room / day
and so on

This could also be done for activities. If I add two activities for the
same subject, why do I need to have one at the bottom (id 200) and the
other at the top (id 5)?

BTW, I haven't used the menu once since I got this new version. I like
the basic concept of the shortcuts. If the dialogs were not modal I'd be
opening all sorts of windows and working much faster. If I could HIDE
buttons selectively I'd even be able to get the secretaries to do the
schedule and save ALL my time.

60--------------------------------------------------------
From Frans:

I refer to the Data menu, space constraints and say students, set of home rooms and then add.
In this box I select the students and then the individual venues.

If I for example already defined an activity tag for Large rooms, I want to add the activity tag
instead of the individual venues.

Now that I think again I doubt if it will be possible, because FET has to make a distiction between
general activity tags and "room" activity tags as the room activity tags must also appear in the rooms
list so that it can be selected. How will FET know this.

61--------------------------------------------------------
From Volker Dirr:

an other useful feature is:
modifying in settings the default min days constraint (for add activity).

because we nearly always use 100%, not 95%.

modifing later all to 100% isn't the best, because there are a few
activities with min days = 0%.

62------------------------DONE-----------------------------

63-----------------------DONE------------------------------

64---------------------------------------------------------
From aliponte:

An activity tag can be assigned the property not to count the underlying activities.

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 
activity of a day). A pseudo activity should be "invisible" for all countings concerning constraints, and for countings concerning statistics (teachers, students, subjects).

65---------------------------------------------------------
From aliponte:

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.

Dialog "Modify activity":
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.)

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).

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.

66---------------------------------------------------------
From Chafik Graiguer and Pietro (see also items #145 and #248):

-Min hours daily with an activity tag (to count real activities only leaving pseudo activities out of count)
-Min hours continuously with an activity tag

67---------------------------------------------------------
From Gert Veltink:

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.

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.

68---------------------------------------------------------
From Mr Robo:

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 morning breaks and lunch breaks combined.

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 finished timetable, such as 'Break' or 'Lunch', it would save me having to edit each Student, Teacher and Room timetable before they 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.

Also suggested by S Chandrasekar:

It would be more desirable if a provision is available to display texts like "SHORT INTERVAL" or "LUNCH INTERVAL" or "ASSEMBLY" in the break time constrains slots in the timetable.

69---------------------------------------------------------
From George Miliotis:

About the "Years", "Groups", "Subgroups" check boxes in add/modify activity and
modify subactivity dialogs:

I'd be more interested in FET actually remembering these settings
globally (not even per form) for each session, no need to actually store
to disk.

70---------------------------------------------------------
From Frans (on forum):

Frans:

I came across the following, it is possible that you know about this:

I generate a timetable with constraints such as minimum hours daily for a students set

Next from the data, students, groups or subgroup menu I deactivate all activities for one group. This group has the constraint minimum hours.

I generate again and then Fet- gives an error message and stops, namely you have too little activities to respect the constraint minimum hours ....

In other words I must go to minimum hours and delete the constraint. It is not deactivated automatically.

As said I do not know if it must be like this. Other constraints such as same starting time are automatically de-activated.

Liviu:

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.

Frans:

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.

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.

If it was possible to deactivate everything only when one uses the data menu.

Liviu:

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.

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.

The perfect approach might be to add a flag to each teacher, subject, activity tag, students set -> active or not active.
It would be kind of tedious and difficult to change now, as it was not designed from the beginning.

71---------------------------------------------------------
From Jason (on guestbook):

Ask for new feature:

- Auto generated after allow user to manual adjust timetable (Drag and Drop in view timetable)

72---------------------------------------------------------
From Zsolt Udvari (on forum):

If I de-activity all activities of a whole year (student set), FET will not ignore "min hours daily" constraint.
So I've two suggestion immedi:
- when FET checks this (and similar) constraints, would tolerate this
- can deactivate the students set (and related activities, constraints, etc.)

73---------------------------------------------------------
From Zsolt Udvari (on forum):

It would be nice when can filter in activities list by "no teacher" and "no students".

74---------------------------DONE--------------------------
From Zsolt Udvari (on forum):

75---------------------------------------------------------
From Chafik Graiguer (on forum):

Clone activities or constraints:

Is it possible to clone activities for one student set to another?
Last year, Year 1S had 3 student sets
Now Two new student sets have been added
Student sets from same year have same activities and of course same time constraints
So how it is possible to do an activities Clone from 1S03 to both 1S04 and 1S05 with or without assigned teachers ? 

76---------------------------------------------------------
From Zsolt Udvari (on forum):

Default settings per subject:

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).

77---------------------------------------------------------
From Chafik Graiguer (on forum):

Save button on Activity Planing Window:

For users working with activity planning window, they will probably spend most of the time on it
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
Can a save button be added to activity planning window?

78---------------------------------------------------------
From Chafik Graiguer (on forum):

About constraint min gaps between a set of activities:

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?
Entering all activities, one by one is tedious
How it is easy/possible to add: min gaps between a set of activites with a tag?

or better:
Min gaps between two subjects/tag

79---------------------------------------------------------
From Chafik Graiguer (on forum):

Filter for modify multiple constraints at once:

In the min days between activities window
there is an option for: Modify multiple constraints at once
Is it possible to add a standard filter: teacher, student set, subject, tag ?
So I can multi-change only those activities with a given subject or teacher... etc?

80---------------------------------------------------------
From Chafik Graiguer (on forum):

Filter teachers:

Students are easily filtered because they are grouped using years then groups
So at Students set not available time window, we can, for example, apply unvailability to only one year, thus affecting  groups under that year
We can also apply unvailability to group, thus affecting  Subgroups under that group.

Unfortunately , teachers are treated either individually or totally (constraints for ALL teachers): ONE or ALL
Zsolt Udvari already wrote:
Quote:
It would be nice when can pair teachers with his/her subjects and can filter in the activity dialog.
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.

So it would be very practical, less time consuming, to treat teachers per groups based on
- Home subject
or
- any other artificial tag like :
-part_time_teachers,
- team teachers,
-..etc

81----------------------------DONE-------------------------

82---------------------------------------------------------
From Valdo (on forum):

Conclusion: he has many teachers, and almost all should have max 2 gaps per week, with 2 exceptions, who may have more gaps. He
does not want to add manually that many constraints. So, he suggests that FET should add constraints for all teachers,
with a selected number of max gaps per week, and then the user can modify each one by hand.

(Suggested indirectly also by Julio González Gil, on the forum.)

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
a single teacher. There were too many constraints to add.

Suggested also by utismetis, on the forum, on 2017-08-07.

Suggested also by Davide Cottignoli, on the forum, on 2017-08-18.

Suggested also by mercurialuser, on the forum, on 2017-09-05.

Suggested also by auriolar and rodolforg, on the forum, on 2018-04-15 (they suggest to add exceptions to the general constraint).
rodolforg: I don't think it needs to change the constraint names. Just add the 'exception' field.

Suggested also by pg788, on the forum, on 2018-07-02

Suggested also by satellite2, on the forum, on 19 December 2018 (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0):
	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)".
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
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"
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
lots of teachers in the university).

See also TODO item #84.

83---------------------------------------------------------
From Massimo Mancini:

1. Constraint not available time slots for a teacher
2. I put a name in filter and I see there's any constraint of this kind on
that teacher
3. Then I press Add. I expect the teacher field filled with the name I used in
filter... but currently FET propose always the first teacher in list.

84---------------------------------------------------------
From Massimo Mancini and Chafik Graiguer:

Consider this:

1. the max num of hours for day is 5 for ALL teachers, the max num for teacher X is 3: this
works

2. the max num of hours for day is 4 for ALL teachers, the max num for teacher X is 5: this
NOT works as expected. FET simply refuse the exception. The exception does
not override the global in any case.

I remember we discussed this "strange" logic (imho an exception is an
exception and always override a global condition) last year, it seems that
the workaround is to manage this scenario using only individual constraints
(isn't it?), very tedious. If so I suggest a button in the form of global
constraint to automatically generate all the individual constraints one
needs.

From Chafik Graiguer (same subject):

My suggestion was not only about adding a teacher one by one
It is about get rid of double menu entries
For example, for Teachers and students, and for every constaint, FET has double entry like this:
-Max days per week for a teacher
-Max days per week for all teachers
-Min days per week for a teacher
-Main days per week for all teachers
...etc
My idea is to make a single entry for any constraint like this :
-Max days per week for teacher (s)

-Min days per week for teacher (s)

This has another advantage:
user will be presented by a window like described in my screenshot, where he can press Add all button
Now suppose, like user X, that I have 50 teachers or 50 student sets
I can easily add them all into Min days per week =5
then on the right pan double click on 5 teachers to deselect them before clicking Add constraint
Then add another Min days per week =3 for those 5 teachers !!
If we have tags for teachers (and rooms) it will even more easier

This concept is already used in FET in two places:
- Set all available, set all not available
- subject has a set of prefered rooms

See also TODO item #82.

85---------------------------------------------------------
From Massimo Mancini:

Consider the form that lists the constraint "teacher non available":
change the line format from DESC CONSTRAINT + TEACHER'S NAME to
TEACHER+CONSTRAINT or, better, codify description of constraint using some string of
fixed size like so:

HTNA - NAME .....

I know the problem of translation (you may omit the description at all, it is
useful only when you display ALL constraints), but I think that a code is less boring
than a long and incomplete description repeated at beginning of all lines.

86---------------------------------------------------------
From Andres Chandia (on forum):

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
teacher of certain group, etc.

87---------------------------------------------------------
From Massimo Mancini:

a problem that we discussed in the past is about the description of
constraints (specially in the list of constraints or in the list of
conflicts): they are too long.
You must well understand that the unlucky timetable maker need to see the
troubles at a glance: reading long sentences with absolutely redundant
parts is very difficult and time consuming.
This is a problem in english but the solution can be achieved also and only in
translations... (a buon intenditor...;-)

So in the following you will find an example of that I think is a good list.
Of course is only my opinion. But, trust me, is a useful one

----- NOW --------------------------------------------------

Conflitti lievi totali: 13.7
Elenco dei conflitti leggeri (in ordine decrescente):
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
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
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
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
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
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
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
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
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
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
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
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
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
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

----TOMORROW I HOPE ()IMHO)-------------------------------------------------

Conflitti lievi totali: 13.7
Elenco dei conflitti leggeri (in ordine decrescente):
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
VT: Num.max. 4 h consec. :  DIRU : Mer : 5 : +0.99
VT: Num.max. 4 h consec. :  GADO : Sab : 5 : +0.99
VT: Num.max. 4 h consec. :  MALG : Sab : 5 : +0.99
VT: Num.max. 4 h consec. :  MESS : Sab : 5 : +0.99
VT: Num.max. 4 h consec. :  OSIO : Lun : 5 : +0.99
VT: Num.max. 4 h consec. :  POLE : Ven : 5 : +0.99
VT: Num.max. 4 h consec. :  PULI : Mer : 5 : +0.99
VT: Num.max. 4 h consec. :  RAPE : Sab : 5 : +0.99
VT: Num.max. 4 h consec. :  xAZ1 : Sab : 5 : +0.99
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
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
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
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

88---------------------------------------------------------
From Volker Dirr:

students set max gaps per week
and
students set begins early

need a filter/checkbox show only O year O group O subgroup
because there are so many students (subgroups) and it is useful to add
that counstraints for lower years. but the list is so long, so it is very
difficult to find the years.

that filter is also useful for students set not available.

89---------------------------------------------------------
From Paolo (on forum):

Well, for me it would be very very (very) important thinking over the constraints while fet is working.

So i ask, kindly, if it is possible getting a print function of all constraints (at least of time constraints).

Liviu: A temporary solution would be to open two FET programs simultaneously.

90---------------------------------------------------------
From daviodan:

Possibility to edit the timetable after generation, drag-drop of activities.

91---------------------------------------------------------
From Yush Yuen:

Sometimes we have 3 teachers available to teach the same "kind" of
class. For example, Teacher A, B C may teach either one of Math for
7A, 7B, and 7C. It is possible that one combination may yield a
timetable that is easier than another. So, it would be nice if we can
have an option to generate "alternative" scenarios with the different
combination.

A possible way to do that may be:
- adding a "teachers-activities pool" dialogue.
- activities of the same pool may swap teacher
- each pool may be enabled or disabled at timetable generating time
(you may not need all combination all the time)
- all generation time, make an option for "generating alternatives"
and save each alternative in a different folder or something

Or:
- activities are created without teachers
- adding a "teacher can teach: activity tag" dialogue
- at generation time, teachers are assigned to activities based on
which teacher has the right "teacher can teach tag"

Or, another way of doing this (perhaps a more elegant way) is to make
a "preferred teacher" constraint like the preferred room constraint.
However, also add an "same room/teacher" option. That is, room/teacher
may be selected from list of preferred rooms/teachers, however, the
same room/teachers must be assigned to the same activities.

92---------------------------------------------------------
From Silver (on forum):

Constraint "Min gaps between activities in the day for teacher".
I mean like this :
when I select Min gaps = 2
Saturday: activity - gap - gap - activity - gap - gap - activity

93---------------------------------------------------------
From George Miliotis (on forum):

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.

An advanced option: "renumber activities" with a dialog asking for "new lowest ID" would be ideal for these merge-split issues.

In this case we could renumber the first FET file from 1, the second from 1000, then copy paste directly into the XML file.

This would get all rules and activities, wouldn't it?

But maybe we could use XSL for this.

94---------------------------------------------------------
From aang (on forum):

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
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,
4 W BIOCRE1, 4 W PHYCRE1, 4 N BIOCRE1, 4 N PHYCRE1, 4 S BIOCRE1, 4 S PHYCRE1
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
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.

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
of days or lessons (depending on the selected timetable)? This way it is easier to print.

95--------------------------DONE---------------------------

96--------------------------DONE---------------------------

97---------------------------------------------------------
From liquid (on forum):

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.

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.

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. 

Update: The maximum number of categories now is 4.

98------------------------DONE-----------------------------

99-------------------------DONE----------------------------

100---------------------------------------------------------
From Chafik Graiguer (on forum):

I spent much time striving to solve an impossible timetable
I wonder if FET can automatically report it impossible then abort
-First case: a teacher having only 5 hours per week: 1+1+1+2 (Min days between activities=1)
With Min hours per day for teachers = 2
This lead for an impossible timetable, but FET desperately trying to solve it for hours and hours

-Second case:
A teacher has 15 hours

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)
But activities were split in a rather strange fashion
Group G1: 3+3
Group G2: 2+2+2+3 (Min days between activities = 1)
Activities from G1 alone would occupy him for 2 days
Then come activities form G2 which require additional 4 days
Total is 6 days !!
I set Max days per week = 5
This leads to yet another impossible timetable

My question: can FET automatically report it impossible then abort?

101---------------------------------------------------------
From drew:

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.

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.

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.

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.

You do similar checking for student groups which have too many activities for the available time slots 

102---------------------------------------------------------
From Christian Kemmer:

I have another suggestion which would make things easier for me.
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.
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.

My suggestion is that there is a checkbox "show subgroups of group" with the following effect:
If I choose a group and activate that checkbox, all subgroups of that group are also shown.
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.
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.

103---------------------------------------------------------
From Silver (on forum):

He needs a constraint to ensure that all activities of each teacher are hosted in different rooms (for exam scheduling).

104---------------------------------------------------------
From Davide G. M. Salvetti (on forum):

Would it be possible to sort on comments the activities list (like sorting the constraints)?

105---------------------------------------------------------
From Davide G. M. Salvetti (on forum):

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
_data_and_timetable.fet, where each activity is (non permanently) blocked in time and space) even when FET gets interrupted, rather than only
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
some constraint.

106---------------------------------------------------------
From Silver (on forum):

He needs "teachers_rooms.html" in the statistics folder, he thinks it would be useful for the examination timetable.

107---------------------------------------------------------
From Horatiu Halmajan and Yush Yuen:

They suggest the possibility of selecting more constraints in the all time/space constraints dialogs and
de(activate)/remove them in a single operation.

108---------------------------------------------------------
From skinkone (on forum):

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
complexity exponentially. However, if you are thinking of going down this road in future developments, I would vote in favor of having such a
feature where students can have "tag preferences". The user would set "minimum or maximum number of tags a student group must have". This would
then be an optimization problem to try to get the most students with their preferences. Essentially FET would form student groups as an output
rather than as an input.

109---------------------------------------------------------
From Jonathan Block (on forum):

It would be nice to have a fourth dimension.

Explanation from Liviu Lalescu: He considers students (1), teachers (2) and rooms (3) as three dimensions. He would like to allocate activities
to teachers (4) (and these teachers should be the fourth dimension, different in concept from the second dimension, but similar to the third dimension).

110---------------------------------------------------------
From Liviu Lalescu:

Possibility (check box, default checked) of safe saving for File/Save and Save as. Maybe even for Timetable/Save data and timetable as.

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.

111-------DONE since FET-5.35.0-(21 December 2017)----------

112---------------------------------------------------------
From murad:

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.

113---------------------------------------------------------
From kdrosos:

In FET there is "School's name", where the school's name appears in the final .html files.

Maybe the text "School's name" can be parametric and thus to allow changing to "Department's name" or "Institution's name" etc.

This can also allow a "School's name field" as:

"Faculty of FET: Department of FET"

Liviu's note: I think that kdrosos refers to the Greek FET. In the English FET, the string is "Institution name".

114---------------------------------------------------------
From Volker Dirr:

Implement constraint "Activity needs several rooms". (I am not 100% sure if it is enough to have a constraint that adds all selected rooms to a
single activity or if it is also needed to get only some rooms from (a larger) selection. So maybe all current "roomS" constraints "just" need an
option "number of used rooms from the selection". Currently it is always 1. It is needed to increase this number.)

Also suggested by Anton Anthofer, and dasa on the forum.

Also suggested by sln_rj, on the forum: I request the developers to kindly update the FET software with the provision to add two rooms for a single
activity. It is utmost important for practical classes where more numbers of rooms are required together.

Also suggested by amin, on the forum: https://lalescu.ro/liviu/fet/forum/index.php?topic=3872.msg20731#msg20731

Additional correspondence with Anton Anthofer:

Anton Anthofer:

An idea/suggestion out of my actual "workaround":

to an activity, I usually add a (group-of) room in the
"activities"-dialog as "Activity tags" => selected
( so I can see and select a room in this dialog and 
  have NOT to change to the "Space" dialog)
( the tag is prepared and contains a suitable selection of rooms with
"An activity has a set of preferred rooms" )

To attach a second room (mostly practice-laboratory) to this activity, i
use the usual workaround
with a second activity and "Activities same starting time" ( Weight
percentage @100% ).

This works fine, but makes a lot of overhead and therefore loss of
overview / risk of timetable-failures.


Regarding this additional room to an activity you mention in the forum
great implementation efforts.

??Idea/Suggestion???:

Add a TEMPORARY-ACTIVITY, initiated by a special (lets say)
"SecondRoomTag".

- the TEMPORARY-ACTIVITY needs only the same subject-name, (same)
duration and information regarding the selection of rooms,
     but needs no teacher and no students!
- the TEMPORARY-ACTIVITY  gets the Time property  "Activities same
starting time" (with the appropriate ID-numbers)
- the  "SecondRoomTag" has the "information regarding the selection of
rooms"  similar to the used tag "An activity has a set of preferred
rooms" 
  with the feature to create an additional, temporary activity
- the TEMPORARY-ACTIVITY is automatically created between starting
"Timetable => Generate" and the generation run itsself
- the timetabling-solution-algorithm has not to be changed
- the result (room) of the TEMPORARY-ACTIVITY is attached to the
original activity
      ( and if necessary the TEMPORARY-ACTIVITY is automatically removed
from the activity list)
-  the TEMPORARY-ACTIVITY itsself is not visible for the user

Suggestion perhaps usefull......?

Liviu Lalescu:

It is a very tricky and difficult item.

If I would implement it the perfect way (no indirect trick), it would
be very difficult and critical bugs might appear; not crash bugs, but
more importantly bugs which would render a feasible timetable as
impossible. This is what I am very afraid of.

I see your workaround and your suggestion to add an intermediate step.
This is not really a good solution, but might be something.

Volker Dirr:

The two/more rooms for an activity should be from the same building?

What about the concept of home room?

115---------------------------------------------------------
From nouvakis:

I've seen that with html files you save a "xxx_data_and_timetable.fet" file.
In this xml file, you save
<Time_Constraints_List> element which contains many <ConstraintActivityPreferredStartingTime>.

These <ConstraintActivityPreferredStartingTime> elements are the generated timetable data (Activity_Id, Preferred_Day, Preferred_Hour).

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)

This file could easily be loaded from a user just to be able to preview the generated timetable inside FET.

116---------------------------------------------------------
From nouvakis:

I would like to suggest an extra optional field to entities of FET program.

For example:
Teachers_List: name, [id]
Students_List: name, [id]
Subjects_List: name, [id]
Hours_List: Name, [id]
Days_List: Name, [id]

etc

When someone (like me) would like to import FET generated timetable data to another program,
there should be a more accurate way to associate an FET entity with my database records beside the name ...

If you add the id field (as an optional field) there should be no problem to users already using FET ...

117---------------------------------------------------------
From mma:

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.

Removing identical constraints reduces the clutter, and perhaps also speeds up the timetable generation?

118------------------------DONE-----------------------------

119---------------------------------------------------------
From Yush Yuen:

For printing: It would nice if I can specify a custom css file for the style.

120---------------------------------------------------------
From Yush Yuen:

I find that while the fixed max-room contraint works well, I notice
something with my situation:

I have a teacher, teacher A, uses room A and teaches year 6 classes. Unlike
the more senior years, which are heavily blocked (lots of constraints with
activities with same start time), year 6 classes are pretty free floating.
Therefore, the year 6 classes always appear at the end of the order of
allocation.

I have included room A as one of the available rooms for the preferred room
list for another teacher. room A is almost always chosen. But the problem
is, teacher A and room A become very difficult toward the end of the
allocation. My timetable has about 1280 activities, and most of the year 6
classes are toward the end of the list. The generation always got stuck
toward the end, like 1250, with teacher A not being able to get the right
allocation.

I don't think this is a bug. This is easily solved by removing room A from
the preferredRooms list for that other teacher. But I just want to point
that out to you.

Answer Liviu Lalescu:

I could improve the algorithm to take care of situations like that. So
it will know that in room A there can be only one type of activity
(one type of look-ahead). Or that in room A there can be only teacher A
(another type of look-ahead). But there are contrary reasons:

1) Will make other timetables slower, by the additional look-ahead.

2) Each look-ahead is to be avoided, because of possible new critical
bugs and general slowdown. There are many look-aheads in FET, but they
are necessary and not very time-consuming.

3) The user is advised to help FET towards a solution. The user needs
to collaborate with FET. (Of course, not necessarily us. We want to
push its limits )

4) This is the most important reason. Say I solve this problem for a
single preferred room for teacher A. But this is not everything. A user
may invent two preferred rooms for teacher A and go into the same
situation, which now becomes more complicated to manage. I cannot
forecast all situations similar to yours.

Please tell me what you think, I might need to treat situation like
these - I am still thinking. Because I did many look-aheads which are
necessary.

121---------------------------------------------------------
From Andres Chandia:

He has a custom version, developed by Liviu Lalescu, which among other things
ensures that if more people open the same file (on a common server), only the first
one who opened it will be able to save it, and the others will see that their file
is read-only. He suggests to add this into official FET. But it might be tricky and
potential bugs might be critical.

122---------------------------------------------------------
From Robert Sutcliffe:

I need to print out all the rules and constraints to document the settings to supply to another system, and for peer review.
Staff availability, activities, room allocation rules, not-overlapping activity selections - everything!
Is there any way to do this?
---Answer Liviu Lalescu: no, there is no direct way in FET---
If not, another web report that details all these settings would be ideal.

123---------------------------------------------------------
From Zsolt Udvari:

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.
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.

And when I activate a whole year these constraints will again be activated.

Answer Liviu Lalescu:

The best would be other buttons: "Activate/deactivate all constraints for selected students year" and so on, for groups, teachers, etc.
Because the button says "Activate/deactivate all activities for selected students year" (it refers only to activities).

124---------------------------------------------------------
From rjmillett (on guest book):

there are many things i would like to have in FET:

1. when adding activities there should be a choice list similar to the new print option now included in 5.18

to add multiple classes (sub-groups) with the same choice of periods and teacher in one click i.e. all same

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

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

4. print preview choice button on main panel

5. un/lock buton on main panel

6. an import and export to EXCEL or txt other than CSV file

7. print option of teachers statistics on preview not from HTML

125---------------------------------------------------------
From Volker Dirr and Bobby Wise:

Bobby:

1) I have a situation where a school has 3 Grade 11 classes. 11a, 11b and 11c.

All the classes have compulsory subjects: 7 Periods of English, 7 periods of
second language (Afrikaans, French and German) and 8 periods of Mathematics.

Then each student must select 1 subject from each of the combinations below:


Combination 1 (6 Periods)

Accounting

Biology

History

Science


Combination 2 (6 Periods)

Art

Biology

Economics

Science


Combination 3 (6 Periods)

Art

Biology

Geography

Science


They also have 2 remaining subjects of 1 period each Life Skills and
Religious Instruction.


They have a 7 day cycle and 6 periods in each day.


Could you please recommend a manner in which I should split the classes in
order to make it possible for all the subject choices?


2) Thanks Liviu, Volker did help while you were away so I have sorted out the
problem.

What I also discussed with Volker was the possibility of a forth category
split. I know it will slow down the generation but for me that is not too
much of a problem. I suggested that perhaps in the Settings Parameters you
should put an option so the user can decide if they would like a 4th
category or not. Then obviously they should realize if they do select the
option that the generation process will be much slower.


Volker:

i had several talkings about the number of categories now again.

what do you think about the following suggestion:

add in the settings a integer "max number of subgroups for split year
automaticly".

by that idea it is much much flexible in the number of categories and
the number of splits per category.

so you can increase/change as long as you are not over that limit.

the current limit is 12*6*6=432.
i think setting the limit to 500 is ok.

we maybe also allow the user to increase that limit a bit more, but of
course only with the warning that it will be slow, produce large html
files and doesn't make sence if it is (much) greater then "real"
students per year.

126---------------------------------------------------------
From Volker Dirr:

1)
>> i just want to tell you this and ask you if we maybe need that also
>> in FET.
>>
>> i am currently coding on an other small tool.
>>
>> i saved settings with QSettings and i reload that settings on an other
>> function.
>> the strange thing was this:
>> i saved QSettings in the destructor ~xxx and reload it in an other
>> function/file again, but it look like Qsettings didn't save. the
>> strange things was that visible/correct as soon as i restarted that
>> reload function a bit later.
>> first of all i tried a QSettings.sync(), but it doesn't help.
>> i also tried with a global variable, but it also doen't help.
>> it look like my "update"-function already run before the destructor
>> source was done.
>>
>> now i removed the destructor ~xxx and replaced it by a protected: void
>> closeEvent(QCloseEvent *event);
>>
>> now all work fine. it look like the protected: void
>> closeEvent(QCloseEvent *event); wait long enough.
>>
>> so a destructor run simultaneously? so it is critical to use
>> destructors with qt, because they might be to slow? (for example if
>> you clear variables, reload variables or something like that.)

2)
i am not sure if it is a problem.

it was more an information to you.

i was able to proove that the destructor is doing his job, but to slow. the
destructor isn't ready if the function go back to the main programm.
if i add a delay in the main programm and check if the destructor have
done his work, then it is ok. but without that delay it isn't ok. so
destructor is slow (i guess it simply run in a second thread
simultaniously).

so the solution is:
a) adding a delay in main code. (but that is a bad style, especialy because
i don't know how long it must be)
b) coding it with an closeEvent. (like in qt book). i coded it with
closeEvent and it run very fine now.

i just didn't check if this is maybe also critical for fet. that is why i
just want to warn you, because it took several hours to find this bug.

Liviu:

I think I understood.

You are right: "The readSettings() and writeSettings() functions must
be called from the main window's constructor and close event handler as
follows:" (from http://qt-project.org/doc/qt-4.8/qsettings.html#details)

I wanted to say: "For efficiency, the changes may not be saved to
permanent storage immediately. (You can always call sync() to commit
your changes.)", but looks like you already checked that.

I think that if the control goes to user interface (like waiting for
user to click), the critical time is gone. So, I hope your situation
will not appear.

I really cannot do all perfectly with closeEvent. There are too many
files. Maybe in the future.

127---------------------------------------------------------
From Volker Dirr:

Lift the limits for the generation algorithm, like MAX_TEACHERS and
MAX_TOTAL_SUBGROUPS.

128---------------------------------------------------------
From yasin dehghan:

1- show warning message when enter 2 same activity
2- add exam date with subject in subject form
3- add list for teacher to show allow subject for each teacher in techer form

Liviu Lalescu:

I will add your suggestions in the TODO, but please explain to us more
detailed:

1 - When the user adds two same SPLIT activities?
2 - I do not understand.
3 - I think you mean each teacher has his own subjects list?

yasin dehghan:

1- no, don't split. when the user add 2 same activity show warning msg and
don't save 2nd activity

2- user able to add date of exam for each subject and print exam date with
subject name, just it, no exam planing and etc

3- yes, user able select list of allow subject for teacher, when add
activity, only allow subject show for teacher or show warning msg if select
don't allow subject

and other sugestion

4- user able enter min and max hour of each teacher per week and show this
min and max hour in teacher statiscal foe compare

129---------------------------------------------------------
From Volker Dirr:

do following speed check:

check all connections of radio buttons.
check if they use singnal toggled.

if you can see 2 times the same slot, then it is bad to use toggled.
example:
this is bad:
connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something(bool)));
connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something(bool)));

this is ok:
connect(radioButton1, SIGNAL(toggled(bool)), this, SLOT(something1(bool)));
connect(radioButton2, SIGNAL(toggled(bool)), this, SLOT(something2(bool)));

if you can find a bad version, then it should be converted into this:
connect(radioButton1, SIGNAL(clicked(bool)), this, SLOT(something(bool)));
connect(radioButton2, SIGNAL(clicked(bool)), this, SLOT(something(bool)));

reason:
if you click a button in bad example, then something is called twice!
(once, because one RB is checked and a second time, because the other RB
is unchecked).
if you use click, then something is called only once.

130---------------------------------------------------------
From Daniel (on forum, see https://lalescu.ro/liviu/fet/forum/index.php?topic=1224.0):

Allow activities to span over breaks. (For the moment, a solution is to split activities
and add constraints two (or three) activities grouped. Another solution is to not
consider explicitly the breaks in the timetable, but this way the constraints of
type max hours continuously may not work as needed.)

131---------------------------------------------------------
From daviodan:

After clicking 'Add' in the add activity dialog, he suggests that the students list
widget should be cleared, because usually the user adds activities for a specific
teacher (with all his students), then goes to another teacher.

132---------------------------------------------------------
From Massimo Mancini:

Display the total number of hours of an activity: when I divide an activity
I would see the total of durations of all defined subactivities.
This total must be updated changing the number/duration of subactivities.

A good place for this changing label could be near number of sub in
group *divide*:

In my mind (italian one) I know that a teacher have 6 hours of a subject,
only then I think about how divide them.
See the total expedite and reduce input errors.

---

comment by Liviu Lalescu:

I added this in the TODO. But there is so little space in the dialog there.

---

comment by Massimo Mancini:

I think the space is pretty enough. There are two suitable places:

1. at the side of the field *divide* (too long, what is the max number of
subactivities? 9, 99, 999?)

2. below the check *consecutive*

the format of the label can be as little as T:xxx (5 chars).

Just this afternoon I spent 2 hours correcting mistakes that I would have
avoided if such counter was in place. Consider the input of a sequence of activities with
similar number of subactivities  but different duration of some sub, consider also that the
tab widget remember the past durations when you reduce and then re
increases the number of subs... so. it's easy (too easy) to insert a wrong total
duration, for a real check you must tab all the subs and add: very boring.

133---------------------------------------------------------
From Massimo Mancini:

First, consider this situation...
1. I'm working on teachers not avalaible (TNA) constraint
2. I filter on MANC, fet show a blank windows: the constraint on MANC not
exist.
3. Good. I add it but the dialog not inherit MANC as selected teacher :-(
why? In general the dialog add/modify is not linked with existing constraints. Fet
prevents, of course,  multiple TNA about the same teacher, but I ask you, is it
possible to link the dialog with existing data?  in this manner the
add/modify functions would be the same. With the wheel of the mouse I can
scroll the list of teachers and quick view/modify the existing constraint!

Second, the comment area. I use it to note some info about the
contents of fet file. I would like to access the comment
space more quickly. My suggestion is "reduce the RECENT button and put near
a COMMENT button"

NEW	OPEN
RECENT	COMMENT
SAVE	AS

good! isn'it? ;-)

The best would be if you could show the first line of the comments along with
the file name in the recents list... so I would avoid to remember...

134---------------------------------------------------------
From Pietro (on forum):

I think would be nice we could enable/disable constraints even in the filtered masks
(ex: "constraints teacher not available times" mask), and not only in the "all time
constraints" mask. The "comments" button would be very useful too.

135---------------------------------------------------------
From Pietro (on forum):

I would suggest one more feature:
it would be very useful to have shortcuts with "ALT or CTRL + key" for the buttons in the various masks all over the FET.
So we could for example enable, disable or delete the various constraints without have to use the mouse, only the keyboard.

136---------------------------------------------------------
From arivasm (on forum):

I think it would be good if the activities dialog would be actualized every
time you enter a new one. That could allow to verify the last entered, and
prevent mistakes, without the need to close the new activity dialog.

137---------------------------------------------------------
From Pietro (on forum):

I think the "pseudo activities" shouldn't be shown in the teacher statistics, or
should be shown in a separate column. Infact, with actual situation the user can
confuse real activity with pseudo one and don't know the real situation.

138---------------------------------------------------------
From Massimo Mancini:

If you close and reopen FET, the central tab widget remain on the tab it
was when you terminated the program.
When FET start, the focus should be always on the File tab.

139---------------------------------------------------------
From Massimo Mancini:

Please consider to implement a shortcut (Alt+C ?) to popup the comment area...

140---------------------------------------------------------
From arivasm (on forum):

When you set the constraints of the times in which the teachers are not available,
maybe you don't know how many teachers wil be finally available for each time slot
(unless you count them manually). So, my suggestion is to include a new statistic
to show that information, in order to correct impossible constraints before start
the timetable generation. Of course, an authomatic detection (less teachers
available than needed) would be better!.

Liviu Lalescu: Sorry, but I do not understand. I already do a check on the number
of activities for each teacher, versus his not available times.

Volker Dirr: Your suggestion isn't that easy as you might think now. It's easy if
teacher/students have full timetables (all timeslots are used), but it's complicated
if the tables are not full.

Liviu already include common checks like that. The checks also need to care about
timetables that are not full (not all timeslots are used). Maybe the checks can be
improved if the timetables are full, but that mean: a) you must code a check that
check if the timetables are full. b) it will help only a few datasets, because most
datasets (compare examples) don't have full timetables.

arivasm: Excuse me if my previous post wasn't clear!

Of course, Volker is right: it will be a weak information know how many teachers are
available for each time slot if the timetable isn't full. Furthermore, the fact to
have for each of all time slots more teachers than groups don't will guarantee that
the whole problem will be solvable. But if the timetable is full, and this condition
fails at some time slot, it will be certain that the problem will be impossible to solve.

The idea arose when I was entering the preferences of my workmates and I suspected that
too many of them were requesting be free at some times, i.e. last class of friday
(of course!). Then I missed to have a simple account as an alternative in order to avoid
passing sheet after sheet, looking for the petition and count them.

141---------------------------------------------------------
From AZ (on forum):

I would appreciate a statistical feature that tells the user which constraint(s) is (are)
causing the greatest number of rejects; if a user could see, during computation, a counter
that tells him the top 10 blocking constraints, maybe the debugging could be easier.
I don't know if it's possible, though.

Liviu Lalescu: Unfortunately, it is probably impossible or it would give wrong results.
But someone should study this suggestion, so I'm adding it in the TODO.

142---------------------------------------------------------
From Etlau (on forum):

Maximum delta in time for day per week per group. For example 7-7-3-4-5 is unacceptable,
better will be 5-5-5-5-6. And same for teacher. Yes, you can set max and min activities
per day, but number need to calculate manualy for every class and teacher, not really
comfortable.

143---------------------------------------------------------
From Etlau (on forum):

Will be nice to click-and-drop and lock activities in shedule directly.

144---------------------------------------------------------
From Etlau (on forum):

Add "start student day" for activity, like "end student day"

Liviu Lalescu: I'll add this in the TODO. But if students begin at first hour,
add preferred times for the activities in the first hours.

145---------------------------------------------------------
From Pietro (on forum) (see also items #66 and #248):

Do you think it is possible to have a "MIN hours daily with activity tag" constraint?

It would be very useful for me because I have pseudo activities and I want to avoid to
have teachers with only one real hour per day followed or preceeded by one pseudo-activity.

146---------------------------------------------------------
From Frans (on forum):

I just wonder how the following can be done.

Let say I set a timetable for a specific term with constraints. The timetable is accepted by everyone and published.

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.

I do have a problem now. If I import the activities then I must add the constraints from scratch, hundreds of them.

If there are only one or two constraints and a few changes to the activities that is ot a problem.
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.

Is there a solution?

147---------------------------------------------------------
From y (on forum):

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?

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.

y: Yes, I think it should work. I'll try this!

Thanks a lot!

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?

148---------------------------------------------------------
From Christian Kemmer (on forum):

For the next timetable at our school, I need the following:

Hours 5 and 6 at one day have the same activity.

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.
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.

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.

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:
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).

I hope that I have explained it clearly.

Thanks for your help.

...

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.

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.

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.

149---------------------------------------------------------
From uni_instructor (on forum):

Finding a good optimized timetable means playing around with the parameters and constraints.

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.
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.
The "history" of modification-steps would give me a good hint on what steps I could try otherwise.

150---------------------------------------------------------
From Nemo (on forum):

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.

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.

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.

151---------------------------------------------------------
From Anton Anthofer (see also item #275):

- modify the IDs of (sub)activities.
- possibility to remove subactivities.
- multicore generation for multiple timetables generation.

Also suggested by sln_rj, on forum:

Is it possible to edit a split option in activity once we entered the data in FET?

152---------------------------------------------------------
From yasin dehghan:

can you add excel export to software
this is so useful for view and share

153---------------------------------------------------------
From Leandro Bueno:

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),
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,
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
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.

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
be shown in terms of number of activities (as it is today) and clock hours in a quick way, right from the FET interface.

154---------------------------------------------------------
From Leandro Bueno:

Always (or never) use span in the HTML timetables if an activity has
duration larger than 1.

155---------------------------------------------------------
From Leandro Bueno:

Another suggestion for a future release is the option to only
"print" to HTML the hours that the students have. In my case, I have
students divided in turns (morning, afternoon and evening) and each
turn only have activities in that specific turn. When I generate the
tables, the morning students' table have the afternoon and evening
hours as not available (there are restrictions for this in the .fet
file). The same occurs in the afternoon and evening students. I
suggest that these not available hours of the students don't end up
in the final HTML table.

Amendment by Volker Dirr:

Should be generalised from "hours" to "hours or days or both".

156---------------------------------------------------------
From Yush Yuen:

It would be cool if there could be an interactive way to do the timetable
generation. For example, in the middle of the generation, I can remove
some constraints on the fly, un-allocate allocated activities, move
activities in different order, ... etc. The work flow might be something
like this:

- hit the pause button
- select activities to be free
- inactivate any constraints
- move some activities to the front
- hit the re-start button

I suppose it will only benefit some crazy hard timetable like my school.
Even that, the timetable is probably plain impossible, but such interactive
approach would make it easier to remove key constraints that makes things
difficult.

157---------------------------------------------------------
From Yush Yuen:

Is it possible that FET could be
customized to do the following:

- Have most of the activities with preferred time and space initially
- but once being placed, it will be treated as if the time and space
allocated was not "preferred" so will be free to float

I am hoping that this way, I can obtain better solution by using a
completed version, unlock some year, then let the program to run again.

Liviu: I did such a custom version for Yush, but it turns out not to work
as needed, because of broken soft constraints.

158---------------------------------------------------------
From Yush Yuen:

It would be great if the list of "all time constraints" could be a
multiple select box. Currently, the way I unlock allocated time is by going
to the "all time constraints" list, filter out the years that I want to
open, then remove them one at a time. Actually, before that, I go to the
student view of the generated timetable, select all, then click unlock time.

It would be nice if I can just do multiple selection and click the "remove"
or deactivate button just once.

159---------------------------------------------------------
From Volker Dirr:

FET -> Data -> Time Constraints -> Activities -> A set of subactivities
have a set of preferred starting times / time slots.
Need also the value to select all activities with the same duration.
(because activities with duration 2 should start only in 1., 3. and 5. hour).
With this constraint a user would need only to set a single constraint instead
of adding a lot of constraints or activity tags.

160---------------------------------------------------------
From Volker Dirr:

get rid of some "unneeded" tags in the xml file.
"unneeded" means: they contain redundant data. this data can be used to
assert the dataset, but is unneeded.
for example:
<Number> in hours list, days list, ...

161---------------------------------------------------------
From Volker Dirr:

if fet can't generate the data ("Cannot generate - please modify your
data"), then the "view difficult activities" pushbutton is disabled. So a
user can't search the bug. so a) enable the pushbutton or (maybe even
better (but only if you use only 100% constraints?)), display the
difficult activities in that textedit with the "Cannot generate - please
modify your data" string.

162---------------------------------------------------------
From Volker Dirr:

generation_pre request: warn if activities has 100% same starting time and
100% preferred room in the same room.

163---------------------------------------------------------
From Volker Dirr:

do an other check in generation_pre.cpp:
if an activity has only 100% one room possible (by one or more
constraints), then sum all hours of the same room and check if (number of
available time slots for room) >= (number of 100% needed slots for this
room by activities).

164---------------------------------------------------------
From Volker Dirr:

name of constraints isn't always the same:
fet has for example: "teacher not available times" constraint.
but it also has :"A set of activities has preferred times"
But are these times preferred? The opposite times are not available.
So this constraint should be called "A set of activities has not
allowed/available times".

maybe even the "activity prefferd time" is also bad, because it is not
only preffered. that is a 100% constraint. even the fet interface call it
"locked". So this constraint should be "An activity has a locked time".

so we get rid of all "preferred" stuff by that. (using instead only
"locked" or "not available").

165---------------------------------------------------------
From Volker Dirr:

if a constraint doesn't refer to an activity, then generating shouldn't
refuse generating. that constraint should be just skipped. Like inactive
things are skipped. it can warn, but not refuse generating.

(this is highly useful, because someone hunt bugs in his dataset, he can
just delete for example some years; just to check if this smaller stuff is
solveable, but some constraints might now refer to no activity anymore,
because the activities are deleted.)

166---------------------------------------------------------
From Yush Yuen:

I made a custom version for myself with a "remove all" button
in the "all constraints" dialog box. I found it necessary for me when I
want to unlock the time constraint for a whole year after a timetable is
generated. The "remove all" button in combination with the filter function
make it very easy to remove a large set of constraints. I was trying to
change the selection box to a multi-select and have a "remove all selected"
button, but I couldn't figure out how to do that easily (hard to manage the
index of array after each removal), so I did the simple remove all instead.
It worked great for me. So, maybe you can consider something similar for
your official release.

167---------------------------------------------------------
From karim (forum personal message to Liviu Lalescu):

max gaps (hours) between a set of activities

Within :
time constraints -->activities
 -min gaps (hours) between a set of activities
+max gaps (hours) between a set of activities

168---------------------------------------------------------
From Davide Cottignoli (on forum):

I would suggest a new simple constraint for teacher:
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:
"Max days per week for a teacher" and "Min days per week for a teacher" that have to set the same value.
Why not add a "Number of workdays per week for a teacher"?
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.

169-------------------------DONE----------------------------

170---------------------------------------------------------
From agemagician (on forum):

1- Print the name of the year, group and class under the institute name.
2- Print the schedule from right to left rather than left to right "very useful for Arabic countries like our academy". - Qt bug (Liviu)
3- Make a bold line between each day in the printing and light line between periods.
4- Make a bold line between groups in the printing.
5- Change the font in the printing.
6- Export the schedule to excel.

171---------------------------------------------------------
From Vlăduț Frățiman (personal email to Liviu Lalescu):

He suggests to drop activities ids and use instead the teacher, students and subject, because ids might puzzle the new user.

Also, he suggests to add icons to the buttons.

172---------------------------------------------------------
From vlad2005 (on forum):

For gaps constraints (and others, maybe) specify the interval for which the constraint should action. Useful for instance
if the user wants teachers to have zero gaps in the morning and in the afternoon, but can have gaps in between these two
periods.

173---------------------------------------------------------
From Davide Cottignoli (on forum):

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.
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?

174---------------------------------------------------------
From liquid (on forum):

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.

175---------------------------------------------------------
From mouiata (on forum) (regarding the custom Algeria version)

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
The program is currently the constraint
a teacher works in an hourly interval max days per week
This is what allows unloading of several periods of morning and evening for the professor without distinguishing between the morning and evening.
In Algeria, a lot of professors in favor of unloading the evening than the morning
I propose to add the the constraint
The least possible number of evening periods that can be discharged to Professor
The least possible number of mornings that can be discharged to Professor

Liviu: Do you mean maximum number, not "least"?

mouiata: I mean, the minimum number if possible
If it is not possible The maximum number

176---------------------------------------------------------
From clouds (on forum):

Topic: teachers for hour

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).
In this way it's possible to see what are the most problematic hours

177---------------------------------------------------------
From MarioMic (on forum):

When I create multiple timetables with fet, to eliminate the bad results (with a high number of conflicts), I have to manually select and
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
folders do not show the level of conflict (it also would be useful to have this, too), and moreover occupy disk space unnecessarily.

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
maximum level of conflict.

Liviu Lalescu: since version 5.20.2 we added a detailed report for multiple generation of timetables.

178---------------------------------------------------------
From Silver (on forum):

I suggest you add new window (interface or small editor) for css .
for hide and view rooms and subject in "teachers_time_horizontal.html" and other timetables.

179---------------------------------------------------------
From nouvakis (on forum):

Min hours per day, max hours per day:

I use these constraints but there is a problem.
If I set
min_hours = 3 and
max hours = 5
and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3
but a better one should be: 5 + 5 + 4 + 4 + 3

So, I recommend a new constraint like "frequency of max hours per day"
For my example this new parameter would be 2 (5+5)

180---------------------------------------------------------
From Pietro (on forum), also by Matsumoto (on forum):

--> A part suggested by Pietro is DONE <--

The second part, suggested by Pietro (on forum):

It would be very nice if the border between different days was thicker.

Or, as suggested by Matsumoto (on forum): A common point my colleagues present is that there's very little emphasis between different days
(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?

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
printing a schedule, both in printable and viewable versions.

181------DONE since FET-5.21.0 - 3 December 2013------------

182---------------------------------------------------------
From Bobby Wise (on forum):

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.

I think that the print order now is in Activity sequence.

183---------------------------------------------------------
From nouvakis (on forum):

The Min days between activities constraint has a weight percentage which I set to 95%.

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%.

If this is possible, then the word force should be replaced by something else.

184---------------------------------------------------------
From Tonny Chan:

Please add a multiple select and then add to FET, then I need not to click the students one by one to a course.

185------------------------DONE-----------------------------

186---------------------------------------------------------
From plaldw (on forum):

Max building changes in a time interval.

187---------------------------------------------------------
From llbuenoo (on forum):

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.

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.

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.

With this table it could be simpler to redistribute Activities or teachers.

188---------------------------------------------------------
From Frans (on forum):

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.

In some institutions the group and subject size are important in calculating workloads and ftes for lecturers.

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.

189--------------------------DONE---------------------------

190---------------------------------------------------------
From Volker Dirr:

most users use the split year automaticly feature only.
some need more categories, but that will produce to many subgroups.

so how about this feature:
a user can disable the "year-group-subgroup" fet and enable only a
"year-group" one.
so he can't modify, add, delete, ... subgroups anymore. subgroups will be
only used and gererated automaticly in the pregeneration and generation
part.

split year automaticly will look the same, but it won't produce subgroups.
instead of this it still store an integer number with the catagory number
to each group.

now only one new basic time constraint is needed:
(i will explain in 2 steps, but i think it can be imporved by storing that
value.)

if you place an activity into a timeslot, then:
1. step: it need to check if there is already an activity of the same year
stored.
no: -> place activity
yes: -> 2. step

2. step: check if that activities (same year) (in fact it need to check
only the first one, because others are already the same) have the same
category.
no: -> impossible to place activity
yes: -> place activity


i am not 100% sure, but i think with this kind of timetabling we can save
space and maybe also improve speed.

the problem is:
how to implement both features ("year-group-subgroup" fet and enable only
a "year-group" one.) at the same time without confusing a user?

191---------------------------------------------------------
From Boubker (on forum):

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 :
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 :
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).
Es ce que vous pouvez me dire comment faire ?

192---------------------------------------------------------
From mbarsan (on forum):

We have a school with 8 periods per day, with a short break every 2 hours.
There are 3 buildings.
Teacher may change building during those short breaks.
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.
If a teacher works in a building at first and second periods, he may change building and work at third period.

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).

Do you think that we may define a grid of hours to allow building changes only at specific periods?

193---------------------------------------------------------
From _indianajones (on forum):

I think it would be useful, in case of difficult generation, to save the incomplete timetable in a .fet file without stopping the process,
so I could convert this file with "Excel FET file import 2010 Marco Albano ver 2.0" and try to solve it manually.

---

Liviu Lalescu: Generate, stop, advanced lock -> lock all activities of current timetable -> save file.

---

_indianajones: ...but in this way the generation is definitively stopped.... am I wrong?

After hours of elaboration I wish to save the best timetable found and let FET goes ahead...
is it possible?

---

Liviu Lalescu: Oh, sorry, I did not see that you wanted generation to continue.

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.

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.

194---------------------------------------------------------
(see also entry #26)
From russell (on forum):

I hope FET could plan courses soon.

195---------------------------------------------------------
From russell (on forum):

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)

---

Liviu Lalescu:

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.

These tricks might work:

- Teacher not available on Thursday;

- Max days per week for this teacher = 4;

- 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;

I hope I got all the details. Please correct me if I am wrong.

---

russell:

Thanks for your reply.

Can you please explain to me about "min+max 3"?  Dose it mean exactly 3 days distance (Tuesday to Friday)?

Dose your solution work for days with different hours (Monday has 8 hours and others 6)?

---

Liviu Lalescu:

The constraint min, then max days between activities.

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).

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).

Please think of other solutions, if you want.

---

russell:

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.

---

Liviu Lalescu:

Maybe better "Teacher works in a days group from a set of days groups".

196---------------------------------------------------------
From russell:

Maybe adding a Pause/Resume to "Generate new timetable" window (changing Start button after press to Pause).

(Related to item #277.)

197---------------------------------------------------------
From nouvakis (on forum, also from mercurialuser, also on forum):

If I set
min_hours = 3 and
max hours = 5
and a teacher should work 21 hours per week we could have combination: 5 + 5 + 5 + 3 + 3
but a better one should be: 5 + 5 + 4 + 4 + 3

So, I recommend a new constraint like "frequency of max hours per day"
For my example this new parameter would be 2 (5+5)

---

Liviu:

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"?

---

Liviu:

I thought about this. I looked over the present code (official FET-5.23.3, src/engine/generate.cpp).

1) The changes are very difficult in generate.cpp. There are many possibilities to consider, and maybe a perfect treatment is impossible.

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.

(I care in these lines above about the gaps.)

2) The changes are critical in generate.cpp. New timetables might become impossible.

Anyway, I'll keep this suggestion in my mind. But for now I do not have the courage/possibility to do it.

I hope that by using some tricks you can overcome the problems.

See also fet-v.v.v/doc/algorithm/improve-todo-item-197.txt.

---

From mercurialuser:

Italian school, students have 5 days, 6 periods each.
Teachers teach 18 periods.

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...

Is it possible to tell FET that teachers may teach 2 periods and 5 periods only once in a week ?

I'm testing with minimum hours per day set to 3 but I feel it is a too strict requirements...

198---------------------------------------------------------
From Volker Dirr (also from mouiata, on the forum):

new useful constraint:
time constraints -> teachers -> max total sum of teachers gaps per week

199---------------------------------------------------------
From liquid (on forum):

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.

Volker:

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!)

liquid:

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:
year - 1
group division: 1. by a and b 2. by i1 and i2 (i for computer science)
you will get the following groups: 1 a, 1 b, 1 i1, 1 i2
and subgroups: 1 a i1, 1 a i2, 1 b i1, 1 b i2
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.

Liviu:

But why not simply divide by a,b then comp.sci. group 1,comp.sci group 2?

liquid:

...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.

Volker:

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.)
Of course new students "wonder" the first day about that shortcuts, but they are clever enough to understand it very fast.

liquid:

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.

---

liquid suggests also aliases for rooms.

Also from abautu, on forum: Could you add an extra field for subjects and teachers to allow for a short name/abbreviation of it?
For example, for a subject called "Classical literature" a short name could be "CL" or "C-101". Then the print timetable features
would allow to print the short names (i.e. compact timetable) or long names (i.e. normal timetable).

See also item #324

200---------------------------------------------------------
(Added on 2014-10-12)
From fromturkey (on forum):

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.
Is it possible with the current algorithm?

Liviu:

Unfortunately, I cannot think of how to adapt the FET algorithm to multiple cores.

201-------------------------DONE----------------------------

202---------------------------------------------------------
From Vanyo Georgiev (on forum):

The last opened FET XML file is opened again at start up.

(Vanyo Georgiev provided the necessary code changes to do this.)

203---------------------------------------------------------
From Vanyo Georgiev (on forum):

One more place to check for a language .qm file - the work path.

(Vanyo Georgiev provided the necessary code changes to do this:
	translation_loaded=translator.load("fet_"+FET_LANGUAGE, QDir::currentPath());
in fet.cpp.)

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.

204---------------------------------------------------------
From Vanyo Georgiev (on forum):

Save and restore tabWidget current page at start up.

(Vanyo Georgiev provided the necessary code changes to do this.)

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.

Anyway, I'll add this in the TODO, as your suggestion.

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.

(Vanyo Georgiev provided the necessary code changes to do this.)

205---------------------------------------------------------
From bharatstank (on forum): ( https://lalescu.ro/liviu/fet/forum/index.php?topic=1826.0 )

bharatstank:

I have below created a Student structure (having 60 students):-

(Student) Year - Group - Sub Group

Year                    Group                    Sub Group
MBACPM (60)       MBA CPM L (60)     MBACPM G1 (30)
                                                       MBACPM G2 (30)
Activity Tags:
Lecture
Tutorial
Practical

Activities created are as follows:-
1. MBA CPM L (Lecture) of a SUBJECT1 for 2 hours duration is conducted by a FACULTY1 for all the 60 students
2. MBA CPM G1 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
3. MBA CPM G2 (Tutorial) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
4. MBA CPM G1 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students
5. MBA CPM G2 (Practical) of a SAME SUBJECT1 for 2 hours is conducted by SAME FACULTY1 for 30 students

6. MBA CPM L (Lecture) of a SUBJECT2 for 2 hours duration is conducted by a FACULTY2 for all the 60 students
7. MBA CPM G1 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
8. MBA CPM G2 (Tutorial) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
9. MBA CPM G1 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students
10. MBA CPM G2 (Practical) of a SAME SUBJECT2 for 2 hours is conducted by SAME FACULTY2 for 30 students

and so on...

How to place the activities - so that:-
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

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.

How to achieve this scenario.

---

Liviu:

I am not sure I understand well, but I think you can use a constraint three activities grouped and two constraints two activities ordered.

---

bharatstank:

using "constraint three activities grouped and two constraints two activities ordered." - here I need to create manual constraints for all the approx. 200 activities.

is there a way - where I can create a Standardised constraints using Activity Tag.
I have defined 3 activity tag (which needs to follow the below sequence):-
1. Lecture
2. Tutorial
3. Practical

As per the guideline - for subject1 - First lecture is conducted, Then its Tutorial is conducted and then its Practical is conducted.

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)

how to resolve this issue.
I have also attached the timetable screenshot:-

1. Correctly placed activity shown in Green circle
2. Wrongly placed activity shown in Red Circle

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.

---

Liviu:

I do not understand the picture in your attachment.

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.

About making this automatic for activity tags - I have added this in the TODO list.

206---------------------------------------------------------
From Vanyo Georgiev (on forum):

There are translations of the FET User manual in several languages https://lalescu.ro/liviu/fet/doc/

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.

207---------------------------------------------------------
From Volker Dirr:

someone used split year automatically.

this year he doesn't need all classes again. class / group "5 d" is not
needed.
so he deletes group "5 d".
but in fact that doesn't improve speed (much), because the number of
subgroups stays the same.

but if there will be a question after removing a group (or year) like "do
you also want to remove all subgroups of this group in all other groups?",
then the number of subgroups will be reduced and it will be easier to
generate.

(Yes, instead of removing a group he could simply use the split year
automatically once again, but maybe he forgot, he has got a new computer, he
already changed "presettings" because of other years or the simply fear
that he will do it incorrect; so he like to use delete group only, because
it is easier.)

Volker wrote code for this, but it is not perfectly optimized for speed.
Below is his code for file fet-v.v.v/src/interface/groupsform.cpp (see
the string Volker Dirr start/end):

old file groupsform.cpp - last modified on 8 February 2015 (FET-5.28.0)
new Volker Dirr's code: 5 October 2015

---
//
//
// Description: This file is part of FET
//
//
// 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)>
// Copyright (C) 2003 Liviu Lalescu <https://lalescu.ro/liviu/>
//
/***************************************************************************
 *                                                                         *
 *   This program is free software: you can redistribute it and/or modify  *
 *   it under the terms of the GNU Affero General Public License as        *
 *   published by the Free Software Foundation, either version 3 of the    *
 *   License, or (at your option) any later version.                       *
 *                                                                         *
 ***************************************************************************/

#include "addstudentsgroupform.h"
#include "modifystudentsgroupform.h"
#include "groupsform.h"
#include "timetable_defs.h"
#include "timetable.h"
#include "fet.h"
#include "studentsset.h"

#include "longtextmessagebox.h"

#include <QMessageBox>

#include <QListWidget>
#include <QScrollBar>
#include <QAbstractItemView>

#include <QSplitter>
#include <QSettings>
#include <QObject>
#include <QMetaObject>

extern const QString COMPANY;
extern const QString PROGRAM;

struct subgroupItem{
	QString yearName;
	QString groupName;
	QString subgroupName;
};

GroupsForm::GroupsForm(QWidget* parent): QDialog(parent)
{
	setupUi(this);
	
	groupTextEdit->setReadOnly(true);
	
	modifyGroupPushButton->setDefault(true);

	yearsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
	groupsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);

	connect(yearsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(yearChanged(const QString&)));
	connect(addGroupPushButton, SIGNAL(clicked()), this, SLOT(addGroup()));
	connect(removeGroupPushButton, SIGNAL(clicked()), this, SLOT(removeGroup()));
	connect(purgeGroupPushButton, SIGNAL(clicked()), this, SLOT(purgeGroup()));
	connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
	connect(groupsListWidget, SIGNAL(currentTextChanged(const QString&)), this, SLOT(groupChanged(const QString&)));
	connect(modifyGroupPushButton, SIGNAL(clicked()), this, SLOT(modifyGroup()));
	connect(sortGroupsPushButton, SIGNAL(clicked()), this, SLOT(sortGroups()));
	connect(activateStudentsPushButton, SIGNAL(clicked()), this, SLOT(activateStudents()));
	connect(deactivateStudentsPushButton, SIGNAL(clicked()), this, SLOT(deactivateStudents()));
	connect(groupsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(modifyGroup()));

	centerWidgetOnScreen(this);
	restoreFETDialogGeometry(this);
	//restore splitter state
	QSettings settings(COMPANY, PROGRAM);
	if(settings.contains(this->metaObject()->className()+QString("/splitter-state")))
		splitter->restoreState(settings.value(this->metaObject()->className()+QString("/splitter-state")).toByteArray());
	
	yearsListWidget->clear();
	for(int i=0; i<gt.rules.yearsList.size(); i++){
		StudentsYear* year=gt.rules.yearsList[i];
		yearsListWidget->addItem(year->name);
	}

	if(yearsListWidget->count()>0)
		yearsListWidget->setCurrentRow(0);
	else
		groupsListWidget->clear();
}


GroupsForm::~GroupsForm()
{
	saveFETDialogGeometry(this);
	//save splitter state
	QSettings settings(COMPANY, PROGRAM);
	settings.setValue(this->metaObject()->className()+QString("/splitter-state"), splitter->saveState());
}

void GroupsForm::addGroup()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	QString yearName=yearsListWidget->currentItem()->text();
	int yearIndex=gt.rules.searchYear(yearName);
	assert(yearIndex>=0);

	AddStudentsGroupForm form(this, yearName);
	setParentAndOtherThings(&form, this);
	form.exec();

	yearChanged(yearsListWidget->currentItem()->text());
	
	int i=groupsListWidget->count()-1;
	if(i>=0)
		groupsListWidget->setCurrentRow(i);
}

void GroupsForm::removeGroup()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
	assert(yearIndex>=0);

	if(groupsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
		return;
	}

	QString groupName=groupsListWidget->currentItem()->text();
	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
	assert(groupIndex>=0);

	QList<QString> yearsContainingGroup_List;
	QSet<QString> subgroupsList;
	//QSet<QString> yearsContainingGroup_Set;
	foreach(StudentsYear* year, gt.rules.yearsList)
		foreach(StudentsGroup* group, year->groupsList)
			if(group->name==groupName){
				yearsContainingGroup_List.append(year->name);
				foreach(StudentsSubgroup* subgroup, group->subgroupsList)
					subgroupsList<<subgroup->name;
			}
			
	assert(yearsContainingGroup_List.count()>=1);
	QString s;
	if(yearsContainingGroup_List.count()==1)
		s=tr("This group exists only in year %1. This means that"
		 " all the related activities and constraints will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text());
	else{
		s=tr("This group exists in more places, listed below. It will only be removed from the current year,"
		 " and the related activities and constraints will not be removed. Do you want to continue?");
		s+="\n";
		foreach(QString str, yearsContainingGroup_List)
			s+=QString("\n")+str;
	}
	
	int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
		tr("Yes"), tr("No"), QString(), 0, 1);
	if(t==1)
		return;
	
	//by Volker Dirr (start)
	QList<subgroupItem> removeSubgroups;
	QString removeSubgroupsStringForGUI;
	foreach(StudentsYear* year, gt.rules.yearsList){
		foreach(StudentsGroup* group, year->groupsList){
			if(group->name!=groupName){
				foreach(StudentsSubgroup* subgroup, group->subgroupsList){
					if(subgroupsList.contains(subgroup->name)){
						subgroupItem tmpItem;
						tmpItem.yearName=year->name;
						tmpItem.groupName=group->name;
						tmpItem.subgroupName=subgroup->name;
						removeSubgroups<<tmpItem;
						removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n";
					}
				}
			}
		}
	}
	
	if(removeSubgroups.count()>0){
		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."
		 " Should the following subgroups be removed also?");
		s+="\n"+removeSubgroupsStringForGUI;
	
		int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
			tr("Yes"), tr("No"), QString(), 0, 1);
		if(t==0){
			foreach(subgroupItem tmpItem, removeSubgroups){
				bool tmp=gt.rules.removeSubgroup(tmpItem.yearName, tmpItem.groupName, tmpItem.subgroupName);
				assert(tmp);
			}
		}
	}
	//by Volker Dirr (end)

	/*if(QMessageBox::warning( this, tr("FET"),
		tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName),
		tr("Yes"), tr("No"), 0, 0, 1 ) == 1)
		return;*/

	bool tmp=gt.rules.removeGroup(yearsListWidget->currentItem()->text(), groupName);
	assert(tmp);
	if(tmp){
		int q=groupsListWidget->currentRow();
		
		groupsListWidget->setCurrentRow(-1);
		QListWidgetItem* item;
		item=groupsListWidget->takeItem(q);
		delete item;
		
		if(q>=groupsListWidget->count())
			q=groupsListWidget->count()-1;
		if(q>=0)
			groupsListWidget->setCurrentRow(q);
		else
			groupTextEdit->setPlainText(QString(""));
	}

	/*if(gt.rules.searchStudentsSet(groupName)!=NULL)
		QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. "
			"The related subgroups, activities and constraints were not removed"));*/
}

void GroupsForm::purgeGroup()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
	assert(yearIndex>=0);

	if(groupsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
		return;
	}

	QString groupName=groupsListWidget->currentItem()->text();
	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
	assert(groupIndex>=0);

	QList<QString> yearsContainingGroup_List;
	QSet<QString> subgroupsList;
	//QSet<QString> yearsContainingGroup_Set;
	foreach(StudentsYear* year, gt.rules.yearsList)
		foreach(StudentsGroup* group, year->groupsList)
			if(group->name==groupName){
				yearsContainingGroup_List.append(year->name);
				foreach(StudentsSubgroup* subgroup, group->subgroupsList)
					subgroupsList<<subgroup->name;
			}
		
	assert(yearsContainingGroup_List.count()>=1);
	QString s;
	if(yearsContainingGroup_List.count()==1)
		s=tr("This group exists only in year %1. All the related activities and constraints "
		 "will be removed. Do you want to continue?").arg(yearsListWidget->currentItem()->text());
	else{
		s=tr("This group exists in more places, listed below. It will be removed from all these places."
		 " All the related activities and constraints will be removed. Do you want to continue?");
		s+="\n";
		foreach(QString str, yearsContainingGroup_List)
			s+=QString("\n")+str;
	}
	
	int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
		tr("Yes"), tr("No"), QString(), 0, 1);
	if(t==1)
		return;
	
	//by Volker Dirr (start)
	QSet<QString> removeSubgroups;
	QString removeSubgroupsStringForGUI;
	foreach(StudentsYear* year, gt.rules.yearsList){
		foreach(StudentsGroup* group, year->groupsList){
			if(group->name!=groupName){
				foreach(StudentsSubgroup* subgroup, group->subgroupsList){
					if(subgroupsList.contains(subgroup->name)){
						if(!removeSubgroups.contains(subgroup->name)){
							removeSubgroups<<subgroup->name;
						}
						removeSubgroupsStringForGUI+=tr("%1 - %2 - %3").arg(year->name).arg(group->name).arg(subgroup->name)+"\n";
					}
				}
			}
		}
	}
	
	if(removeSubgroups.count()>0){
		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."
		 " Should the following subgroups be removed also?");
		s+="\n"+removeSubgroupsStringForGUI;
	
		int t=LongTextMessageBox::mediumConfirmation(this, tr("FET confirmation"), s,
			tr("Yes"), tr("No"), QString(), 0, 1);
		if(t==0){
			foreach(QString tmpItem, removeSubgroups){
				bool tmp=gt.rules.purgeSubgroup(tmpItem);
				assert(tmp);
			}
		}
	}
	//by Volker Dirr (end)
	

	/*if(QMessageBox::warning( this, tr("FET"),
		tr("Are you sure you want to delete group %1 and all related subgroups, activities and constraints?").arg(groupName),
		tr("Yes"), tr("No"), 0, 0, 1 ) == 1)
		return;*/

	bool tmp=gt.rules.purgeGroup(groupName);
	assert(tmp);
	if(tmp){
		int q=groupsListWidget->currentRow();
		
		groupsListWidget->setCurrentRow(-1);
		QListWidgetItem* item;
		item=groupsListWidget->takeItem(q);
		delete item;
		
		if(q>=groupsListWidget->count())
			q=groupsListWidget->count()-1;
		if(q>=0)
			groupsListWidget->setCurrentRow(q);
		else
			groupTextEdit->setPlainText(QString(""));
	}

	/*if(gt.rules.searchStudentsSet(groupName)!=NULL)
		QMessageBox::information( this, tr("FET"), tr("This group still exists into another year. "
			"The related subgroups, activities and constraints were not removed"));*/
}

void GroupsForm::yearChanged(const QString &yearName)
{
	int yearIndex=gt.rules.searchYear(yearName);
	if(yearIndex<0){
		groupsListWidget->clear();
		groupTextEdit->setPlainText(QString(""));
		return;
	}

	groupsListWidget->clear();

	StudentsYear* sty=gt.rules.yearsList.at(yearIndex);
	for(int i=0; i<sty->groupsList.size(); i++){
		StudentsGroup* stg=sty->groupsList[i];
		groupsListWidget->addItem(stg->name);
	}

	if(groupsListWidget->count()>0)
		groupsListWidget->setCurrentRow(0);
	else
		groupTextEdit->setPlainText(QString(""));
}

void GroupsForm::groupChanged(const QString &groupName)
{
	StudentsSet* ss=gt.rules.searchStudentsSet(groupName);
	if(ss==NULL){
		groupTextEdit->setPlainText(QString(""));
		return;
	}
	StudentsGroup* sg=(StudentsGroup*)ss;
	groupTextEdit->setPlainText(sg->getDetailedDescriptionWithConstraints(gt.rules));
}

void GroupsForm::sortGroups()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
	assert(yearIndex>=0);
	
	gt.rules.sortGroupsAlphabetically(yearsListWidget->currentItem()->text());

	yearChanged(yearsListWidget->currentItem()->text());
}

void GroupsForm::modifyGroup()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	
	QString yearName=yearsListWidget->currentItem()->text();
	
	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
	assert(yearIndex>=0);
	
	int q=groupsListWidget->currentRow();
	int valv=groupsListWidget->verticalScrollBar()->value();
	int valh=groupsListWidget->horizontalScrollBar()->value();

	if(groupsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
		return;
	}

	QString groupName=groupsListWidget->currentItem()->text();
	int groupIndex=gt.rules.searchGroup(yearsListWidget->currentItem()->text(), groupName);
	assert(groupIndex>=0);

	StudentsSet* sset=gt.rules.searchStudentsSet(groupName);
	assert(sset!=NULL);
	int numberOfStudents=sset->numberOfStudents;
	
	ModifyStudentsGroupForm form(this, yearName, groupName, numberOfStudents);
	setParentAndOtherThings(&form, this);
	form.exec();

	yearChanged(yearsListWidget->currentItem()->text());
	
	groupsListWidget->verticalScrollBar()->setValue(valv);
	groupsListWidget->horizontalScrollBar()->setValue(valh);
	
	if(q>=groupsListWidget->count())
		q=groupsListWidget->count()-1;
	if(q>=0)
		groupsListWidget->setCurrentRow(q);
	else
		groupTextEdit->setPlainText(QString(""));
}

void GroupsForm::activateStudents()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
	assert(yearIndex>=0);

	if(groupsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
		return;
	}

	QString groupName=groupsListWidget->currentItem()->text();
	int count=gt.rules.activateStudents(groupName);
	QMessageBox::information(this, tr("FET information"), tr("Activated a number of %1 activities").arg(count));
}

void GroupsForm::deactivateStudents()
{
	if(yearsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected year"));
		return;
	}
	int yearIndex=gt.rules.searchYear(yearsListWidget->currentItem()->text());
	assert(yearIndex>=0);

	if(groupsListWidget->currentRow()<0){
		QMessageBox::information(this, tr("FET information"), tr("Invalid selected group"));
		return;
	}

	QString groupName=groupsListWidget->currentItem()->text();
	int count=gt.rules.deactivateStudents(groupName);
	QMessageBox::information(this, tr("FET information"), tr("De-activated a number of %1 activities").arg(count));
}
---

208---------------------------------------------------------
From Volker Dirr:

Code more checks to warn users about conflicting constraints before generating. For example:
min days between activities and consecutive/grouped activities constraints.

209---------------------------------------------------------
From andrealva:

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:

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) ...
it would help to quickly identify them without using the filter ....

210--------------------------DONE---------------------------

211---------------------------------------------------------
From Volker Dirr:

FET asks if the user is sure he wants to add an activity without students. Maybe the question must also
include something like "it is correct if you want to add a teacher meeting."

So that the user is not deterred by the warning in situations in which an activity without students is OK.

212---------------------------------------------------------
From Bob Hairgrove (on forum):

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:

Code:

void AddConstraintStudentsSetNotAvailableTimesForm::colorItem(QTableWidgetItem* item)
{
	if(USE_GUI_COLORS){
		if(item->text()==NO)
			item->setBackground(QBrush(Qt::darkGreen));
		else
			item->setBackground(QBrush(Qt::darkRed));
		item->setForeground(QBrush(Qt::lightGray));
	}
}

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.

213-------------------------DONE----------------------------

214---------------------------------------------------------
From Khalilullah Yosufi:

... we expect from software to generate a timetable that we could separate some border or jointed gaps for some teachers
but there is no any place to define/plan to the software about separating the jointed gaps during a day. Hopefully
someday we would receive an update version of the FET software that has ability to separate joint gaps we want maybe
by the name of continuously gaps per day for a teacher. ...

---

Further clarification:

... Hope one day we could plan or tell to the FET software to add Maximum continuously gaps per day for a teacher = 01 ...

---

Further clarification:

I need a gap to be maximum 1 hour continuously.

215---------------------------------------------------------
From mercurialuser (on forum):

To better study the code I'd like to clean generate.cpp:
- removing all the commented code
- adding comments to illustrate the algo
- check to see if I can use some macros for code
- in randomswap try to remove all that ok* variables that can be reduced to a couple (since they are not used outside their block)
- remove the #if 1/#endif and if(1) { ... }  blocks

216---------------------------------------------------------
From mercurialuser (on forum):

I'd just like to report some thing that may give a little speedup to the code and to avoid duplicates.

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.

For assigning these matrixes and some others the code loops (there are 2 variants with different variable names):
for(int j=0; j<gt.rules.nInternalActivities/*added_act*/; j++){

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.

217---------------------------------------------------------
From Bob Hairgrove:

Liviu:

> > I wrote in the advice on how to translate to not translate the
> > large 5 fields in HelpAboutForm_template (which contain difficult
> > and large fields, subject to future changes). If you check now,
> > your translation of the About is lost (but it is inevitable).

---

Bob:

> Wouldn't it be better to have the strings in a separate file where
> they could be translated, then build the HTML text in a function
> which is not routed through the tr() macros? None of the HTML stuff
> should be in the .ts file, anyway ... IMHO.
> 
> Should be easy enough since (I assume) there is only one "About..."
> form. I wouldn't necessarily translate the list of translators, but
> the names of the languages could be translated and the HTML code built
> outside of the tr() function as described above.

---

Liviu:

Unfortunately, I see no easy way to do this. Using a separate file for
these is not good.

Even if I used simple text instead of HTML, for each new entry I add
all the previous translated text is lost, if I lupdate with -noobsolete.

I will add this correspondence, and your next email which I just
received, to the TODO list.

I am not sure what to do.

----

Part 2:

Bob:

Of course, if you don't want the HTML in this form to be translated,
there is a much easier way to get rid of it (see attached
screenshot). ;)

(Bob is referring to the property "translatable" of the string.)

---

Liviu:

:-) Yes, sure, I thought of this, but some people might really want to
translate in a hypothetical situation. All strings in FET should be
translatable, I think (I am not sure, though).

218---------------------------------------------------------
From Volker Dirr:

since FET is able to change split year automatically without losing
activities, it is useful to load and save the settings.
i don't talk about qsettings. it it already stored there and that is fine.
but the settings are different a bit. so year 5 and 6 have very similar
categories and divisions, but year 7-10 have got a bit different.
so it would be fine to save and load them into a file. so a user can save
settings for year 5-6 and save settings for year 7-10. i am not sure if
into the fet file or into a separate file. it has different advantages and
disadvantages. but i think into a new separate file is a bit better.

219---------------------------------------------------------
From chintu and Volker Dirr (on forum):

chintu: I have 80 teachers in school, in an academic year if one teacher
leaves the school the work load of the teacher is shared with 5 teachers
and say about 15 teacher in overall is effected. but remaining 65 teachers
time table is still the same. If i re generate the time table all 80 teachers
time table will be effected, i want to retain the time table same for 65
teachers and only change for 15 how can i achieve this?

Liviu: You can generate the timetable, then view the timetable for teachers,
and select all activities for a teacher and click "Toggle lock/unlock".

Volker: Maybe we should make the unlocking possible without generating the
timetable, as in the "Advanced lock/unlock" menus.

Liviu: In this case, do it also for students?

220---------------------------------------------------------
From Volker Dirr (on forum):

When the user clicks "Toggle lock/unlock" with zero selected cells in the
"Timetable view" dialogs, maybe it would be better to inform more verbosely
the user: "No activities were locked/unlocked, because no activities were
selected".

221---------------------------------------------------------
From Volker Dirr:

in years dialog should be an option: increase all years.

now pseudo code: (mixing strings and int. so real code is a bit more
complicated)

foreach(year, yearsList){
 if(year = int){
    newYearsList<<year
 } else {
   warning = "unchanged"
}

sort newYearsList from high to low

foreach(year, newYearsList){
  newIntYear=year++;
  search that year.
  foreach(group, year){
     foreach(subgroup, group){
       if(subgroup.left(year){
         subgroup.replace.left(newIntYear)
       else
         warning = "impossible to rename. maybe modified manualy?"
      }
     if(group.left(year){
       group.replace.left(newIntYear)
     else
       warning = "impossible to rename. maybe modified manualy?"
    }
    if(year.left(year){
       year.replace.left(newIntYear)
     else
       warning = "critical bug!"
   }
}


222---------------------------------------------------------
From Mohamed NAJARI:

1) Can you add a command to move the teachers, students, materials and activities during entry?
2) Why not put weight as the 100% value by default instead of 95% during the addition of an activity?

223---------------------------------------------------------
From youssouf (on forum):

My suggestion is : activating the partition button when modifying the teacher's task.
because :
1. We enter the teacher's tasks ( choice - subject - Partition - period - etc.)
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.

224------------------------DONE-----------------------------

225---------------------------------------------------------
From jillali elghazoui (on forum):

jillali:
At the end of the production time table
we sometimes want to change instead of an activity
But if we follow the normal route of fet its currency fully all activities
Is there is a way to change the place of this activity specifically
Without major changes in the other activities

Liviu:

Either:

1) Open from ~/fet-results/data_and_timetable.fet, then unlock a specific activity and regenerate;

or

2) After generating, select Advanced lock -> lock all activities of the current timetable. Then unlock a specific activity and regenerate.

But you may obtain an impossible timetable.

jillali:

You're right, we can not get what we wanted
Is it possible for this to work  a new property under the name:

"a teacher's not available times with the current  timetable"

as "not available times" are "the free hours withe the current  timetable"
And it will save in "a teacher's not available times"
And when we want to produce a new table we change a table for one teacher

---

We also ask you for a similar property in Students set
It seems that these characteristics would be more effective
You can set the blank time
Although it is possible to move Activitys
For a teacher or more
Or for one Student set or for more

226---------------------------------------------------------
From AlexL (on forum):

My proposal is to use transifex for translations: https://www.transifex.com
It works fine with .ts files, has suggestions for translations, .etc.

227---------------------------------------------------------
From MilesM (on forum):

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.

228---------------------------------------------------------
From adso (on forum):

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.
And have a file fet also not complete to import into Excel to be able to work manually.

229---------------------------------------------------------
From Volker Dirr:

About adding constraints students/teachers interval max days per week:

I think you should clarify it in the interface: In FET you call it only
"interval start hour" and "interval end hour", but you might say better
"start at beginning of hour" and "end at end of hour" (or "until end of hour").

230---------------------------DONE--------------------------
From Maouhoub:

231---------------------------------------------------------
From Davide Cottignoli (on forum):

I often need to input many activities with fixed time in working hours and I find the user interface very tedious.
It would be more simple if the dialog is divided in two parts a follow:
On the left a list of activities (not the combo-box or drop-down box).
On the right a table grid with hours and day and the permission to mark only a square of the grid.

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.

232---------------------------------------------------------
From Davide Cottignoli (on forum):

Implement lock/unlock of activities from a specific building.

233---------------------------------------------------------
From Volker Dirr and Liviu Lalescu:

About coloring the three timetable view dialogs:

Volker:
A combobox with "disabled" as first item should be perfect for that task.

Coloring produces sadly pretty many very similar colors. That should be
fixed. (for example by skipping similar colors or calculating a fixed
difference between colors.)

Liviu:
The user can wish to choose the coloring of each view, in a settings menu:
Color teachers view by: Students, Subject, Tag, etc., or disabled, etc.

234---------------------------------------------------------
From Luigi Valbonesi:

When fet generates timetables, to run a parallel routine that saves
every new generated timetable (the best possible at the moment)
overwriting the previous and the most difficult ativities with the one
that blocked the generation. If the computer crashes there will be some
data to think about and work with.

235---------------------------------------------------------
From fernandolordao and Volker Dirr (on forum):

fernandolordao:
By default, teachers time constraints are permanently shown at same sequence that we add.
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.
Similar sort options could be designed to other restrictions.

Liviu Lalescu:
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

Volker:
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.

In fact nearly all constraints and activities should be sorted. For TODO:

Add a new dialog in FET->advanced->sort

there should be checkboxes and a sort pushbutton.
the checkboxes should be:
sort teacher constraints by teacher names.
sort students constraints by students names.
sort room constraints by room name.
sort teacher names of all activities
sort students names of all activities
sort activity tags of all activities

236---------------------------------------------------------
From Wizard (on forum):

Wizard:

Is there a way to set a minimum distance between first teaching hour and last teaching hour?
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.

Liviu Lalescu:

Unfortunately, I think this is impossible. I am not sure it can be implemented in the FET algorithm.

237---------------------------------------------------------
From Volker Dirr:

maybe for the TODO:
simplify the FET interface.
it is currently much to confusing if you work with it.
There are many constraint for a single teacher and all teachers.
it's unhandy to always check 2 lists.
in fact there is normally only a single "all" constraint.
in fact this suggestion should be done similar to students and rooms.

but i explain now with a single example, so it's easier to explain:
there are 2 dialogs:
fet -> data -> time constraints -> teachers -> max gaps per week for a 
teacher
fet -> data -> time constraints -> teachers -> max gaps per week for all 
teachers

it should be only a single dialog:
fet -> data -> time constraints -> teachers -> max gaps per week
the dialog is similar to the current one. just ordered. first the "all" 
constraints, then the "single" constraints.

that will help much, since you only need to check a single list now and 
it is still ordered, because the "all" will be always the first.
this save a lot of space in the fet main window interface.

then there are 2 ideas how to implement it.
idea a)
fet -> data -> time constraints -> teachers -> max gaps per week
can stay as "fet -> data -> time constraints -> teachers -> max gaps per 
week for a teacher" currently is.
the "add" button must be renamed to "add one". And a "add all" 
pushbutton must be added.

idea b)
we can also remove a lot of dialogs. in this example:
remove
fet -> data -> time constraints -> teachers -> max gaps per week for all 
teachers

then only modify
fet -> data -> time constraints -> teachers -> max gaps per week for a 
teacher
the combobox of this dialog only need a "all teachers" as first item.

i prefer variant b, because it will save a lot of code, memory, 
translations, ...

238---------------------------------------------------------
From Volker Dirr:

The activity description must be more detailed.

Example:
If i check FET->Data->time constraint->activities->min days between 
activities
the right information box is not detailed enough. i need to more 
information if i want to decide if the activity should keep 100% or if i 
can reduce it.
i need to know also the Duration.
So instead of for example:
Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a)
Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a)

it should display:
Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:1)
Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1)

because in that case i will keep maybe reduce the weight of that 
constraint down to 0%.

but is it for example this:
Activity with id=9 (T:LAL, S:Ek, AT:16, St:5a, D:2)
Activity with id=10 (T:LAL, S:Ek, AT:16, St:5a, D:1)

then i will never reduce it under 100%, because a 3 hour activity is to 
long.

239---------------------------------------------------------
From Volker Dirr:

Shorten the strings in conflicts.txt. They are much too long. Very
confusing if you read that. (Maybe use shortcuts, sort them by type and
call the type only at the beginning of the list, ... There are many
variants to write it more clear.)

240---------------------------------------------------------
From Davide Cottignoli (on forum):

I have this simple suggestion that would, in my case, save a lot of time:

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.
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.
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.
Then regenerate all the timetable to obtain the new HTML even for these teachers.
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.

Is it possible to do this and speed-up data enter?

241---------------------------------------------------------
From ant7 (on forum):

I do some tricks to make pair of activities to be
scheduled the same time but in two neighbouring days.
Because of that I need the constraint:
Fixed number of days between activities (with default value equal to 1).

To achive it I use:
Minimum number of days between activities (set to 1)
 and
Maximum number of days between activities (set to 1)
so

t1-t2>=1day   and   t1-t2<= 1day    give  t1=t2 + 1day

Could you add this constraint?
Fixed number of days between activities (with default value equal to 1).

When I have to click hundreds of times  Min and Max... constraints
I would save a lot of time if you add this constraint.

Also from abautu, on forum: A constraint "Exact N days between activities" would imply "Min N days between activities"
AND "Max N days between activities". I use these two constraints simultaneously in order to force two activities to be
scheduled in same week days (in an odd/even timetable).

242---------------------------------------------------------
From Lizio (on forum):

Lizio:

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.

Liviu:

Maybe you could add activity tags to activities, and use the constraint students activity tag max hours per day?

Lizio:

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.

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).

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.

Liviu:

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.

To consider a sum of weights might be too difficult to implement.

243---------------------------------------------------------
From Lizio (on forum):

come posso fare a dire a FET che deve mettere due attività concomitanti, ma non fissate, bensì scelte da un insieme?

Facciamo un esempio:
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.
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.

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)

---

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.

Now I want in the gymn 2 classes of the same grade and not 2 of different grades.

The problem is that in my school we have 31 classes...

I don't want to put toghether 2 classes of my choice as this would be a real hard constrain to be managed.

244---------------------------------------------------------
From Arsenio Stabile:

He has a custom version, so that if he has minimum gaps between building changes = 1,
if a teacher name ends in " AB", if he changes buildings from hour 3 to 4 from
a building ending in " A" to a building ending in " B", the gap is no longer necessary.

Liviu Lalescu:

I am sorry, but this kind of constraint is too specialized. I cannot
think of a name and good implementation for everybody to use it. I
think I'll add your suggestion in the TODO list.

About you choosing the hours - this can made on your custom version,
but again I am not sure about a good way to present it to the user.

Arsenio:

In Italy it often happens that a school is divided into two buildings
one hour away for which is required a gap for the exchange and this
creates a major constraint. Some time ago I saw a commercial program
that provides the opportunity to do so now the gap is not attributed
to a teacher if the change takes place in the building at a certain time.

245---------------------------------------------------------
From ant7 (on forum):

After timetable generation
in timetable tab (teachers, students etc.)
I can see which activities are time or space locked ( I see LT or/and LS acronims)
and I can toggle these constraints for one or more activities whith mouse highlighting.
It would be very usefull If I can see the same signature in HTML files.
When I updates timetable many times on website
I would like to tell people that some their activities are already fixed time or place.
It should be some general option in FET allowing user to decide wether show this tags or not in HTML files.
When timetable is finished it should be easy switched off visibility of the two tags in all timetable in HTML files.
I don't want to insert these tags manualy in activity dialog because it is some cumbersome.

246---------------------------------------------------------
From Nguyễn Hữu Duyệt (on forum):

Activate/deactivate more activities at once.

247---------------------------------------------------------
From Volker Dirr:

rethink about all used QList stuff in generate.cpp (in FET version 5.28.3)

examples:

Line 293: QList<int>& conflActivities
conflActivities is used only to check "contains". So isn't a QSet better/faster?

Line 1990:
QList<int> occupiedRoomsList;

it is only used for a foreach. So maybe a QStack or QQueue is better/faster?

So maybe all should be rechecked.

Liviu: You are right. The first part is more important, but I also need the
same order of the conflicting activities, as they are added. So I could
add a QSet and a QList together. But this will require more memory
allocation and operation. I am not sure.

248---------------------------------------------------------
From Vangelis Karafillidis (on forum) (see also items #66 and #145):

Is there ANY way to achieve a constraint like: "Min hours daily with an activity tag for a students set"? The polar
opposite (max hours) is available in FET, but what about MIN HOURS? I was thinking of the equivalent of inserting
for each day the constraint "a set of activities occupies max time slots from selection", but this might severely
slow down the whole process...

Liviu:

On each day, or only on non-empty days?

If on each day: Please try with activities occupy max time slots from selection; it will not slow down the process.
This constraint is highly optimized.

Also from Benahmed Abdelkrim, on forum: I suggest adding the following constraint: min hours daily whith an activity tag.
It allows to impose a minimum of daily hours with a tag. Especially to distinguish real and pseudo-activities in several cases.

Also from s.lanore, on forum:

I have 5 lunch activities with preferred time slots for each student. One for each day of the week.

My issue is that I would like to use the ConstraintStudentsSetMinHoursDaily and that I don't have a way to ignore my lunch activities with this constraint.
Meaning that if fet finds a timetable with a day off (which is allowed) the ConstraintStudentsSetMinHoursDaily will make it impossible because there will
be the lunch activity no matter what. Indeed, if we have a day with only the 30 min lunch activity for the student and the minHoursdaily constraint is set
to 1 hours it won't be good..

One way to solve it would be to have a ConstraintStudentsSetMinHoursDaily with an activity_tag and i'd add an activity_tag to all my activities except
the lunch ones.

249---------------------------------------------------------
From Handaya:

DONE since FET-5.29.0 on 15 March 2016 --> 1) what if the html result be colorful also as in the program ?
(This point was also suggested by hudrea and by Udo Schütz). <-- DONE
2) what if the colors be the same for the same teacher ?
3) what if the program allows marking a weekly meeting for all teachers
without printing every name in the cell of timetable result ?
4) what if the timetable result be printable or saveable in some diferent
formats like doc and pdf ?

Liviu:

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
difficult for us, the programmers, to color them as in the FET
interface. <-- DONE

(2) - In the interface, the colors are the same for the same
subject/subject+students set. This is what we came to after some
thinking.

(3) - This would be possible, but I would need to keep in the .fet data
file an attribute which does not belong to timetabling, and I prefer
not to.

(4) - .doc and .pdf - you could print the timetable to a pdf file, or
copy/paste the HTML code to a doc file.

250--------------------------DONE---------------------------

251---------------------------------------------------------
From Bobby Wise:

I suggest that perhaps an additional printout be added that displays
all the teachers that are not occupied in a particular period.

So it is basically a Free Teacher timetable printout, but it does not have
any comments like "Must come earlier" or "Single gap", it just displays the
names of all the teachers who are not working in that period.

252--------------------------DONE---------------------------

253---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

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?
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?

Liviu:

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.

Benahmed Abdelkrim:

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.
   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.
  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.

   yes, absolutely, you can add it to the TODO file because this feature in my opinion is very useful for any time saves.
    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.
   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.

254---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

 j'ai deux suggestions:
            la première:
   pourquoi ne ajouter dans le dossier fet-results, un fichier qui permet de savoir les horaires des salles vide?
  ce fichier va aider a mieux contrôler l'énergie électrique en éteignant la lumière le temps que ces salles soit vides.
  la deuxième:
               cette opération qui ce fait maintenant de façon manuelle. peut on la rendre automatique via un logicielle lié a FET?

I have two suggestions:
  the first:
                why not add in the folder fet-results, file that lets you know the times of empty rooms? as the file: Teachers Free Periods
                This file will help better control the electric power by turning off the light as long as these rooms is empty.
  the second:
                   this operation that now done manually. can we make it automatic via a software related to FET?       

Volker Dirr:

about first suggestion:
Rooms Free Periods: In my opinion only needed if you want to swap a room. I think i can add it if Liviu agree.
On the other hand you can already do it today with TiTiTo (selecting empty rooms; swap rooms; ...)
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.
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.

about second suggestion:
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?

255---------------------------------------------------------
From math user (on forum):

It would be great if "teachers", "subjects", ... would be customizable (settings). For universities "lecturers" and so on.

256---------------------------------------------------------
From ChicagoPianoTuner:

I have a feature request for FET: in the timetables menu after a successful
generation, there is a button to "lock/unlock" all activities when I'm
looking at a particular subgroup or teacher or room. If I click it, all
activities lock, and clicking again unlocks. I would prefer two separate
buttons, one for lock and one for unlock. The reason is sometimes I have 4
subgroups where they share many activities (but not all activities), and I
want to lock all activities for that particular group (or year) but cannot
do it all at once.

Liviu:

Unfortunately, there is not enough space in that dialog.

257---------------------------------------------------------
From MING-KIAN JONATHAN CEDRIC LEE KIM GNOK and Volker Dirr:

All the users to start FET by double-clicking a .fet file (so that the FET executable won't complain:
"To start FET in interface mode, please do not give any command-line parameters to the FET executable.").
We could open in such a case the first file given as a command-line parameter to the FET executable.

Liviu:
It is bad to mix the version accepting command-line parameters (fet-cl) with the one not accepting them (fet).

258---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

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..

Liviu: It is a bit weird to export the constraints - what format to choose?

Also suggested by sln_rj, on forum.

259---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

write directly into cells Activity planning, especially for the activities which are not divided(not split).
for the activities that are divided, we can momentarily kept the weight by fefaut (95%), and later change it if we want.

260----------------------DONE-------------------------------

261---------------------------------------------------------
From Volker Dirr:

a second rooms statistic:

print all activities with the (maybe) used rooms.
but only an unordered list will be "bad" to read/check.
so there should be a not only a simple list.
there should be a filter to check faster.
so filter all activities by subject, teacher or students set.

262---------------------------------------------------------
From Volker Dirr:

add a new column in "fet -> Statistics -> Teachers Statistics"
the column get the name "teachers qualification".
so the user can see the the data that he entered.

and:

add a new column in "fet -> Statistics -> Subjects Statistics"
the column get the name "teachers qualification".
so the user can see the the data that he entered (indirectly).

263---------------------------------------------------------
From math user (on forum):

math user: It would be great if components / subactivities always get the same room (option).

Liviu: You have the constraint activities occupy max 1 different rooms.

math user: Yes, that is exactly how I have solved it. But I have to enter a condition for each activity
(lots of conditions). Therefore a (global) setting "same room for all components of an activity" would be nice.

264---------------------------------------------------------
From Volker Dirr:

at the end of the generating algorithm, so after all activities are
placed (but before locking the activities?!) there should be a simple
algorithm that cares about rooms "bugs". this algorithm must not be
perfect, it should only fix "bad" stuff.
1) check if there is an activity without a room, even if it is got a space
constraint with weight less then 100%
2) if there is an activity with a room, it should check if it is
possible to place a smaller room to this activity
3) maybe repeat step 2 a few times to get a better result. (the result
might not be perfect, but it is ok.)

265---------------------------------------------------------
From math user (on forum):

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).
Like that, the user does not have to change the values manually after each generation.

266---------------------------------------------------------
From Volker Dirr:

Generating a difficult timetable shows 28 h... . Should it show 1 d 4 h... ?

267---------------------------------------------------------
From daltinkurt (on forum):

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?

268---------------------------------------------------------
From Volker Dirr:

maybe we can add a check for this:

teacher max hours per day is lower than activity duration.

269-------DONE since FET-5.34.0-(26 October 2017)-----------

270---------------------------------------------------------
From auriolar (on forum):

It would be nice to be able to limit the time a teacher is in the school.

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.
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).

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.

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
for each teacher (a solution which you partially imply).

271---------------------------------------------------------
From auriolar (on forum):

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.
Maybe it could be done for rooms to.

272---------------------------------------------------------
From Bob Hairgrove (on forum):

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.

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.

Or is there a better way?

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.

273---------------------------DONE--------------------------

274---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

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 ?.

If this feature is created, the tables will be lightweight, and easy to read.

275---------------------------------------------------------
From Anton Anthofer (see also item #151):

- remove the "modify subactivity" menu and move that feature into the "normal" activity menu.
- modify the id
- recalculate the ids
- a complex calculation of the number of students.
- generate very similar timetables

276---------------------------------------------------------
From Volker Dirr:

a) Add also conflicting activities into
activitiesConflictingPercentage if there is a constraint with:
activities with min days between activities and weight 100%
two grouped activities with weight 100%
two consecutive activities with weight 100%
two ordered activities with weight 100%
min gaps between activities with weight 100%

b) Check if it speedups if there is a QList/QSet timetable[hours_per_week] and
checking the activitiesConflictingPercentage at the very beginning.
because activitiesConflictingPercentage contains a lot of constraints.

Liviu Lalescu: I think this is impossible/infeasible.

277---------------------------------------------------------
From mercurialuser (on forum) (and similar, from JBoss, also on forum):

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
possible to "pause" a run and "restart" it later, surviving a pc reboot?

From JBoss:

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
to switch off the PC but doesn't want to loose the N-hours of elaboration done so far.

(Related to item #196.)

278---------------------------------------------------------
From mercurialuser (on forum):

If you can't change a value (usually a 100% setting, or allow empty days) please disable the widget... it is misleading...

Rewording by mercurialuser:

There are some constraints that must have the % field set to 100. Unfortunately the field is editable and it causes confusion, expecially for newcomers.

I suggest to keep the field on screen but just disable it, make it not editable...

279---------------------------------------------------------
From mrtvillaret (on forum):

In the add constraint teacher not available dialog mark with "b" the slots in which there is a global break.

Liviu Lalescu: also in students set or room not available and activity(ies) preferred times?

280---------------------------------------------------------
From Lizio (on forum):

It could be helpful to put disable and enable buttons in every windows about constraints, not only in the "All" ones.

It could be helpful too to put those buttons also on windows about activities.

281---------------------------------------------------------
From Lizio (on forum):

I think it could be very helpful to let multiple selection in every window about data and constraints.

In this way you can select some of them to apply actions with buttons.

282---------------------------------------------------------
From Volker Dirr:

Volker provided code for a faster generation if one uses constraints room not available times. But it is too risky for now.
Maybe in the future.

Volker: Disalow timeslots of activities if a room is not available.

Volker's code:

...
Matrix2D<double> notAllowedTimesPercentages;
Matrix2D<double> notAllowedTimesPercentagesFromSpaceConstraints;

//breaks are no gaps - I keep track of this
//bool breakTime[MAX_HOURS_PER_WEEK];
...

...
	t=computeActivitiesRoomsPreferences(parent);
	if(!t)
		return false;
	
	//Before computeFixedActivities(...)
	t=computeNotAllowedTimesPercentagesFromSpaceConstraints(parent);
	if(!t)
		return false;
	//////////////////
	
	/////////buildings
	t=computeMaxBuildingChangesPerDayForStudents(parent);
	if(!t)
		return false;
...

...
bool computeNotAllowedTimesPercentagesFromSpaceConstraints(QWidget* parent)
{
	Q_UNUSED(parent);

	//Speed improvement (start) by Volker Dirr
	notAllowedTimesPercentagesFromSpaceConstraints.resize(gt.rules.nInternalActivities, gt.rules.nHoursPerWeek);
	
	//TODO: check if this is correct
	for(int i=0; i<gt.rules.nInternalActivities; i++){
		for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
			notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=-1;
		}
	}

	for(int i=0; i<gt.rules.nInternalActivities; i++){
		if(!unspecifiedPreferredRoom[i]){
			bool roomsWithWeight100Found=false;
			QSet<int> allowedRoomsSet;
			for(int kk=0; kk<activitiesPreferredRoomsList[i].count(); kk++){
				PreferredRoomsItem& it=activitiesPreferredRoomsList[i][kk];
				if(it.percentage==100){
					if(!roomsWithWeight100Found){
						allowedRoomsSet=it.preferredRooms;
						roomsWithWeight100Found=true;
					}
					else{
						allowedRoomsSet.intersect(it.preferredRooms);
					}
				}
			}
			if(roomsWithWeight100Found){
				if(!allowedRoomsSet.isEmpty()){
					for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
						bool noRoomAvailable=true;
						foreach(int room, allowedRoomsSet){
							if(notAllowedRoomTimePercentages[room][hour]!=100){
								noRoomAvailable=false;
								break;
							}
						}
						if(noRoomAvailable){
							if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){
								notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100;
							}
						}
					}
				} else {
					//TODO report a warning. There is no allowed slot at all
				}
			}
		}
		else{
			if(!unspecifiedHomeRoom[i]){
				if(activitiesHomeRoomsPercentage[i]==100){
					for(int hour=0; hour<gt.rules.nHoursPerWeek; hour++){
						bool noRoomAvailable=true;
						foreach(int room, activitiesHomeRoomsHomeRooms[i]){
							if(notAllowedRoomTimePercentages[room][hour]!=100){
								noRoomAvailable=false;
								break;
							}
						}
						if(noRoomAvailable){
							if(notAllowedTimesPercentagesFromSpaceConstraints[i][hour]!=100){
								notAllowedTimesPercentagesFromSpaceConstraints[i][hour]=100;
							}
						}
					}
				}
			}
		}
	}
	//Speed improvement (end) by Volker Dirr
	
	return true;
}

bool computeMinDays(QWidget* parent)
...

...
bool computeFixedActivities(QWidget* parent)
{
	bool ok=true;

	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
		int notAllowedSlots=0;
		for(int tim=0; tim<gt.rules.nHoursPerWeek; tim++)
			if(notAllowedTimesPercentages[ai][tim]==100 || notAllowedTimesPercentagesFromSpaceConstraints[ai][tim]==100)
				notAllowedSlots++;
		
		if(notAllowedSlots==gt.rules.nHoursPerWeek){
...

...
	s+=GeneratePreTranslate::tr("End - the order of activities (id-s)");
	s+="\n";
	initialOrderOfActivities=s;
	
	if(initialOrderStream!=NULL){
		(*initialOrderStream)<<s;
		(*initialOrderStream).flush();
	}

	//After computing the initial order, because it is already taken care of.
	//Speed improvement (start) by Volker Dirr
	for(int i=0; i<gt.rules.nInternalActivities; i++)
		for(int t=0; t<gt.rules.nHoursPerWeek; t++)
			if(notAllowedTimesPercentagesFromSpaceConstraints[i][t]==100)
				notAllowedTimesPercentages[i][t]=100;
	//Speed improvement (end) by Volker Dirr
}
...

283---------------------------------------------------------
From flauta (on forum):

Three teachers must guarantee presence of 1 or more of them in each hour of the timetable (medicine subminstration in emergency case)

Liviu: There might be possible a new constraint, activities occupy min time slots.

284---------------------------------------------------------
From alienglow (on forum):

Could you please add a setting to display the full file path of the data file in the title bar.
e.g. Instead of showing just "datafile.fet" if there can be a setting to display "D:\Data\FET\datafile.fet".
You can also think of doing this via a status bar, where if possible more info can be displayed.
For the statusbar you can have display options like - data file name, current output directory etc.

285---------------------------------------------------------
From mercurialuser (on forum):

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.

I then added a "TEACHER max hour per day with a tag" constraint set to 3.

All the test run with (where I disable the most strict constraints) completed the timetable.

When all the constraints were enabled, no way to go upper than a value, in all the runs.

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....

I moved the constraint to Students....

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

286---------------------------------------------------------
From noddy11:

He asks if there is an easier way to activate/deactivate activities. It is to complicated since he needs do it many times.
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.
An other solution might be activating similar to the activating of constraints.

287---------------------------------------------------------
From Davide Cottignoli (on forum):

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?
This can speed up manual adjustment when a timetable is generated and, virtually, can speed up the locks for any activities aggregation.

288---------------------------------------------------------
From Devrim Altınkurt (on forum):

 think, maybe you can think about only place AN ACTIVITY (not two acts / subacts) over a break.
i know it is diffucult problem. but i know there are another schools which want you do this in Turkey.
maybe you add an option ([ X ] can place over a break) for each activity (not subacts)
and the users can choice if the lesson place like this or not.

289---------------------------------------------------------
From Davide Cottignoli (on forum):

He suggests that it is possible for the user to change from LT (locked time) to PLT (permanently locked time) and viceversa and from
LS (locked space) to PLS (permanently locked space) and viceversa, from the timetable view dialogs, by selecting cells.

290---------------------------------------------------------
From Devrim Altınkurt (on forum):

i think there is a bug about "Activity tag preferred room(s)" constraint.
i attached a fet file. you can take a look at it.

bug steps:

    time table: 1 day and 12 hours
    added some lessons, student groups, ...
    added 13 activities with 1 hour to different subgroups and subjects
    added a tag to all activities
    added an "Activity tag preferred room(s)" with this tag and one room.
    there is not enough room but FET don't detect this.

Liviu Lalescu:

It is not a bug, it is more like a suggestion.

291---------------------------------------------------------
From thanhnambkhn (on forum):

When investigating Fet command line source code, I see there are 2 types of return value: return 0 or 1 (fet.cpp), therein:
- Value "1" means error (can not generate time table) always.
- But value "0" somewhere mean success, but somewhere mean error (when time exceed or abort). (fet.cpp - line 1380)

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)

Liviu: I consider that my way of treating this is better.

292---------------------------------------------------------
From Malamojka (on forum):

Notebook:

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.
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.
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).

293---------------------------------------------------------
From Malamojka (on forum):

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.

294---------------------------------------------------------
From Malamojka (on forum):

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.

295---------------------------------------------------------
From Malamojka (on forum):

Four suggestions on constraints:
1. Would it be possible to add: space -> Activities -> An activity has a preferred building. It would help me a lot.
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)?
3. Is it possible to have variable weight on teachers not available time (for their ideal time, set at maybe 99%)?
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).

Liviu:

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.
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.
3. Please use constraint activities preferred time slots.
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.

For point 2. please see also item #364.

296---------------------------------------------------------
From Malamojka (on forum):

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).

297---------------------------------------------------------
From thanhnambkhn (on forum):

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.
I think you should consider design Fet in the future in this way:
- FET-cl is core
    + With many options, apis,
    + Allow to extend or customize but keep work with the official
    + With standard output (xml, json ...)
- FET desktop (or any other App) is only front-end, calls to these Fet-cl 's api.
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)

298---------------------------------------------------------
From canhathuongnhau and Volker Dirr (on forum):

Volker:

The dataset is impossible.
It is very easy to prove that.
Please check teacher T.
That teacher is teaching 24 hours.
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
the morning. So there are only 25-2=23 slots left.
It is impossible to set 24 hours into 23 free slots.

Could we add a test for this?

Liviu:

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
activities, each one with its preferred time slots.

299---------------------------------------------------------
From Volker Dirr:

don't always break/disallow generating if there is a warning at the 
beginning. that is pretty bad. sometimes FET gives warnings, even if the 
dataset is solveable. (For example if you add an activity tag, but no 
activity is using that activity tag). i like that FET is reporting this 
potential bug. But the FET behavior is bad, since 
it shouldn't disallow generating.

also maybe rethink about printing all warnings into a single 
string/editor. since by this i can copy and paste those warnings and fix 
them all at one. at the moment i always need to read and fix it always 
step by step (because i can't remember always all reported bugs, especially 
if i check datasets from other users and or if i can't even read the 
characters (Arabic, Russian, ...)

300---------------------------------------------------------
From Jijo Jose:

1.  Export the result to Excel format
2.  Add xml dtds for xml display

301---------------------------------------------------------
From Julio González Gil (on forum):

Rephrased by Liviu Lalescu:

We need more preliminary tests for the constraint teacher(s) min hours daily, to avoid
unnecessary work to discover the bugs. For instance, if we have teacher(s) min 2 hours daily
with allow empty days, and:

- The teacher is only available one hour on a day, or
- The teacher has one activity divided into two components, 100% min 1 days between them,
each component having duration 1.

302---------------------------------------------------------
From Volker Dirr:

generate multiple: instead of a fixed max time use a more flexible max 
time. "Calculate max X minutes longer than the time the last max 
activity was placed" or "Countdown x minutes if no new max placed 
activity was found"
so for example thre is a countdown timelimit with 5 minutes.
as soon as a new max placed activity was found the counter restarts at 5 
minutes.
  so the time limit is 5 minutes.

303---------------------------------------------------------
From Julio González Gil (on forum):

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.

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).

---

Liviu Lalescu: Maybe also for students?

---

Volker Dirr:

a) fet should show a "speed warning" only. so user can modify hisself
or
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.)

---

Julio González Gil:

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).

---

Liviu Lalescu:

The code could look like:

			for(int d=0; d<gt.rules.nDaysPerWeek; d++){
				int nFreeSlotsDay=0;
				for(int h=0; h<gt.rules.nHoursPerDay; h++){
					if(!teacherNotAvailableDayHour[tc][d][h])
						nFreeSlotsDay++;
				}
				if(nFreeSlotsDay>0 && nFreeSlotsDay<teachersMinHoursDailyMinHours[tc]){
					ok=false;

					int t=GeneratePreIrreconcilableMessage::mediumConfirmation(parent, GeneratePreTranslate::tr("FET warning"),
					 GeneratePreTranslate::tr("For teacher %1, the constraint min %2 hours daily is useless on day %3. Please make this "
					 "teacher not available on this whole day, for performance and better correctness checking.")
					 .arg(gt.rules.internalTeachersList[tc]->name)
					 .arg(teachersMinHoursDailyMinHours[tc])
					 .arg(gt.rules.daysOfTheWeek[d])
					 ,
					 GeneratePreTranslate::tr("Skip rest"), GeneratePreTranslate::tr("See next"), QString(),
					 1, 0 );
			 	
					if(t==0)
						return false;
				}
			}

to be added at the end of the function "bool computeTeachersMinHoursDaily(QWidget* parent)" of file src/engine/generate_pre.cpp.

304---------------------------------------------------------
From jillali elghazoui:

In the Add activity dialog, add a check box near Selected (students) list widget. The combo box may be called "Activities separately"
and, if selected, will add more activities, one for each selected students set.

Liviu Lalescu: I am so sorry, but I think it is not a good thing to add. It will complicate unnecessarily the interface.

305-----------------------DONE------------------------------

306---------------------------------------------------------
From Volker Dirr (on forum):

Teacher(s) max gaps continuously (a constraint that limits the number of continuous gaps).

Liviu Lalescu: seems difficult. But you may use a trick: add a dummy activity with duration 1 for each allowed gap for the teacher,
with activity tag "gaps", then make max gaps per week for that teacher 0, then use constraint teacher max hours continuously
with activity tag "gaps".

Volker Dirr:

The workaround is fine for the full time teachers at my school; but it is bad for part time teachers, since the workaround affects
also the min/max number of hours per day and also the number of days per week.

307---------------------------------------------------------
From math user (on forum):

The links to each table (#table_12) are great.
The only problem is that the link for a certain teacher changes when another teacher is added or removed.

---

Why not keep #table_12 and so on and just make them permanent (associated to a certain teacher, group, room, ...)?
Say #table_12 belongs to teacher Abc: The ID #table_12 is stored for this teacher. Suppose the last stored ID is #table_50.
Adding a new teacher will result in ID #table_51 being associated with that teacher, and so on.
Removing say teacher with ID #table_34 will make no changes, i.e. the next new teacher gets ID #table_52.

There should be a setting to change between consecutive IDs (default - as in the current version) and permenent IDs (my suggestion).
When switching from permanent to consecutive, all IDs are reallocated when the timetable is generated.

---

Liviu Lalescu:

Unfortunately, I think this is (very?) complicated.

---

rodolforg:

Maybe a hash of room name?
table_roomXXXX where XXXX is a hash?

---

Liviu Lalescu:

I thought of this, too. But there might appear conflicts, and solving them is not easy. Also, numbers are nicer than a hash value.

---

rodolforg:

Another option is to convert room/subject/teacher/etc. name to URL encoding? Like http://doc.qt.io/qt-5/qurl.html#toPercentEncoding

---

Volker Dirr:

that will avoid duplicates.
advantage is the permanent link.
disadvantages are that Arabic (and other) users will have trouble to read it and the file size will grow.

---

Liviu Lalescu:

I think white spaces should also be encoded, which is not done by default?

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.

I can add this in the TODO, and if more people ask, I will reconsider.

308---------------------------------------------------------
From math user (on forum):

He refers to the all time/space constraints dialogs:

What about CTRL+F to select Filter and CTRL+G to select Sorted? That would speed up usage (keyboard only - no mouse needed).

309---------------------------------------------------------
From rodolforg (on forum):

Constraint teacher(s) min continous gaps in window (for instance, the teachers should have 6 continuous gaps on a day, for lunch, when
the FET time slot corresponds in reality 10 minutes).

310---------------------------------------------------------
From Matsumoto (on forum):

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
to export the timetables in LibreOffice would really help spread FET around my area.

See also TODO item #18

311---------------------------------------------------------
From Matsumoto (on forum):

To help see difficult days/times, FET could have a statistics that shows the amount of available teachers at every period of the timetable,
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:

	Day 1	Day 2 	Day 3
Hour 1	4	4 	4
Hour 2	6	2 	4

I filled in random values for hour 2 just to have more detail

This should allow the user to quickly spot times where more teachers could be needed before the generation starts. Maybe in addition to the
number of teachers also have the names?

From Volker Dirr:

we can skip this dialog, since it is still too much work to check; it
can be improved much more!

add a new (locked) feature:
"check min teachers per slots (except breaks)"
Here a user can enter the number of classes (or: if smaller: the number
of courses).

Than in generate_pre it is always checked by default if that minimum
number is fulfilled or not.

Advantage: you don't always need to check manual
number_of_slots_per_week every time you added/modified a constraint. You
only need to add that number one time and it will always check
automatically.

312---------------------------------------------------------
From Vangelis Karafillidis:

New constraints:

Teacher(s) max span per week;
Teacher(s) min span per day;
Teacher(s) min span per week;
Teacher(s) min gaps per day;
Teacher(s) min gaps per week;
A set of activities has min common time slots with another set of activities.

Min simultaneous activities from a set.

A set of activities occupies MIN time slots from a selection.

Also suggested by auriolar, on forum: Teacher(s) max span per week.

313---------------------------------------------------------
From Silver (on forum):

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 ... .
With this suggestion, we add the splits and duration 1 time for the subject.
Exmple: Physics1 have 2 split in the week, so why I add this info in every activity for Physics1?!

314---------------------------------------------------------
From Benahmed Abdelkrim and Volker Dirr (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=3141.0

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.

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.

Volker Dirr:

I think one (maybe) needed is following constraint:
constraint teacher is working only in one out of two set of times.

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:
the first constraint:
    1. set of times contains all morning hours on Monday.
    2. set of times contains all evening hours of Monday.

the second constraint:
similar with Tuesday.
...


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.
That could be also solved with the constraint above: "constraint teacher is working only in one out of two set of times."
So this time he need to setup like this:
the first constraint:
    1. set of times contains all night hours on Monday.
    2. set of times contains all morning hours of Tuesday.

the second constraint:
...

So again as many constraint as you have days (or days-1 if you don't work over weekend).

---

Volker Dirr:

The other will be the gaps constraints.
So a constraint like:
"max gaps per day in an interval" and "max gaps per week in an interval" might be maybe enough.

So you maybe need to add only 2 constraints:
1. "max gaps per day in an interval" with the interval : "first hour of of morning" up to "last hour of morning"
2. "max gaps per day in an interval" with the interval : "first hour of of evening" up to "last hour of evening"

---

Benahmed Abdelkrim:

I believe it's time to rethink the 2 variants of FET with the official version.
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.

It is while working on the official version that I recently discovered this bug that accelerated the release of version 5.31.5.

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.

The time was lengthened in this way (of the hours of waiting), which I have now abandoned this project.

Now the idea has been raised again but in another way that has encouraged me to intervene here.

I believe it is possible to use the official version to realize time tables in the Algerian or Moroccan way.
For this purpose it must consider the addition of the following time constraints:

1. Min hours in a time interval
Interval = first hour of morning(or afternoon) - last hour of morning(or afternoon)
2. max gaps in the last(or first) hour of morning(or afternoon) for students (set)
3. activity(ies) ends students interval.

---

Benahmed Abdelkrim:

...So it is possible -in my opinion - to integrate both versions in official FET, reasoning not by day, but by interval.
Can open a dialog with the user to define the number of intervals he wants.

 for example:
Interval1 = first hour of morning - last hour of morning
interval2 = first hour of afternoon - last hour of afternoon
interval3 = first hour of evening - last hour of evening
...etc.
And can also define between each interval a constraint of break time.

In this way can integrate the time constraints specific to 2 versions customized in official FET.

315---------------------------------------------------------
From math and Volker Dirr (on forum):

Constraint order two lists of activities, so that the first list is before the second list.

316---------------------------------------------------------
From math (on forum):

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
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.

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
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
equipped with a chalk board or a white board. While most lecturers prefer white boards, lecturers of math related courses usually prefer chalk boards.

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".
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
Preferred Rooms" for each of these activities. My problem is exactly the following process of assigning rooms.

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
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
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
on third floor of building N", "managed by the Computer science department", "Seminar room equipped with Projector and Whiteboard", "capacity for 50 students".
So if I need a mid-sized seminar room, I have to go all through the list, selecting all matching rooms.

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
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
appropriate rooms.

And I would like to suggest a way that should be easy to implement, not demanding any changes to the timetabling algorithm at all.

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
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
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
"mid-sized seminar room" with all appropriate rooms.

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
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.
As a matter of fact, I could also select multiple collections or other rooms.

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
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.
This way the algorithm gets the very same input as before, not requiring any changes here.

I would be more than happy if you could add this collection feature to FET.

317---------------------------------------------------------
From math (on forum):

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
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
than others.

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
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
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
manually move the activity from the old lecture hall to the new.

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
the feature that I miss most in FET.

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
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
option "change room to..." could appear with a sub menu holding all the available alternative rooms.

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
not focus on post-generation optimization at all".

318---------------------------------------------------------
From Volker Dirr:

since multicore CPU are more and more normal today we should rethink 
about that.
as i can see it will be impossible ((also?) because of speed) to 
generate only ONE timetable with multicore.
so the "only" variant is to generate multiple tables on different core.

we should already "prepare" the source for this. (it mainly just mean: 
tidy up. no real "new code" is needed for that.)

so it mean:
all variables that didn't change after generate_pre is calculated should 
be store in a single structure. so all cores can read from that single 
structure.

all variables in generate that will be "modified" while generating 
should be stored into an other structure.

by that we prepared the source for later. so as soon as we start coding 
multi core support we just need to do a list of that structure, so each 
core get/care about its own data.

(even if we never add multicore this tidy up migth be useful, since it 
might help reading the source)

319---------------------------------------------------------
From Vangelis Karafillidis:

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.
(But A1 may be placed immediately after A2).

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,
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.

320---------------------------------------------------------
From Volker Dirr:

get rid of max_days_per_week and max_hours_per_day.
one needed step for that is redisigning the interface, since the 
interface use it.
it won't be too difficult to fix that.
just add hours per day and days per week as a QStringList (like teacher 
names, subject names, ...)
this dialog should get buttons like in teachers, rooms, subjects, ...
so add a button with "up" and "down" to move the name.
"rename"
"clear all"
"delete"
"add"

the hours per day dialog should maybe also get a button with a spinbox 
to add X names at once.
Like name "1", "2", ...
or "1.", "2.", ...
or ...

the days per week dialog should get 3 buttons like:
"add Monday to Friday" (so it add those 5 days. if you press that button 
again, it should add once again. so there will be 10 days added (maybe 
with an attached small string).
"add Monday to Saturday"
"add Monday to Sunday"
"add From a date To a date" So you can select 2 calender dates and it 
just add all that dates.

321---------------------------------------------------------
From Vangelis Karafillidis:

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
the modifications of an existing timetable... The code actually exists! Just to be "connected" to these windows (views).
Teachers view:
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,
teacher available times, max days per week, home room etc.
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.
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).
Students view:The corresponding options for the students, as mentioned above.

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.
For example, modifying the data (teacher name, etc). THIS WOULD BE MUCH BETTER, SO ONE COULD MAKE MODIFICATIONS ON ALL FET FIELDS WITHOUT EXISTING THESE WINDOWS.
But, I don't know how complicated this part is. I have no C++ programming skills, but it seems easy.
The above suggested options focus on MODIFYING AN EXISTING TIMETABLE WHICH IS A COMMON PRACTICE IN REAL LIFE SITUATIONS AT SCHOOLS. I KNOW AND I ACCEPT THAT
MATHEMATICALLY AND COMPUTATIONALLY MODIFYING AN EXISTING TIMETABLE IT'S NOT THE BEST APPROACH.

Liviu Lalescu:

Your suggestions are not so easy to implement.

322---------------------------------------------------------
From Vangelis Karafillidis:

After testing the new display (mainly teachers time horizontal) for partially modifying an existing timetable, I thought of a suggestion. Most likely, it's
similar to "remove redundant constraints". The suggestion is to add a (percentage) multiplication factor for each one of the "groups" or time constraints.
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
(for example 98%)Students' time constraints (for example 90%)Activities time constraints (for example 20%) This would affect ONLY the constraints that can have
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.
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
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%.
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
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
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
modifying the existing one.

Liviu Lalescu:

I do not agree with this idea. But I added it in the TODO.

Please note that max gaps per week/day for students/teachers constraints can only have 100% weight.

323---------------------------------------------------------
From Vangelis Karafillidis:

He suggest that all the constraints teacher not available could be presented in a teachers time horizontal manner (teacher as row, day/hour as column).

Further suggestions:

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.
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.
Teacher's not available times: The teachers time horizontal view would be much more flexible
a) The user could monitor at once all teachers
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
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
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",
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
not available for this specific hour.
Student's not available times:For similar reasons the time horizontal view is by far more flexible.
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
his/her data efficiently (with the existing GUI).

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
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
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
(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
adds or removes an hour, this number should change.
An example for the students: The same for the students...

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
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
on his/her data.

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
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.

324---------------------------------------------------------
From rodolforg (on forum):

Add short names for teachers (and maybe students, subjects, activity tags, rooms).

See also item #199.

325---------------------------------------------------------
From Darren McDonald (on forum):

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.

I've often got a group of activities that need to have the same starting time, for example

Mathematical Studies 1 (1+1+1)
Mathematical Studies 2 (1+1+1)
Mathematics SL 1 (1+1+1)
Mathematics SL 2 (1+1+1)
Mathematics HL (1+1+1+1)

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
each subject, one for the second subactivity, and one for the third, with the final Mathematics HL subactivity left free), where each constraint involves
a list of 5 subactivities (which increases the possibility of error).

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,
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)
the first 3 subactivities should have the same start time (day+hour).

326---------------------------------------------------------
From Darren McDonald (on forum):

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
(particularly in International Baccalaureate Diploma Programme schools), there are often a number of changes as students change subject choices.

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
the selected groups from the Modify Activity screen (perhaps below the Clear button?).

327---------------------------------------------------------
From Zsolt Udvari (on forum):

Add a subject tag for each subject (like: "easy" or "hard") and add time constraints for these subject tags.

328---------------------------------------------------------
From Valdo (on forum):

Export the resulted timetables in time horizontal form.

329---------------------------------------------------------
From Matthias Söllner:

Add an option for the FET command-line version, so that after the generation there will be written also the CSV timetable.

330---------------------------------------------------------
From Volker Dirr:

Maybe this is a good time to restart coding csv stuff.
my old csv stuff was very "powerful" and "compressed", but sadly also 
very bad "expandable"/(coded).
also other guys asked for exporting other time constraints. nearly 
impossible to add that into the old code.

so i suggest this:
- we keep the old csv stuff, so everyone can still use this "powerful" 
feature. it will be also stable (never change the file format anymore).
- we add a new csv export (and also import). maybe call it "version 2" 
or "beta" or "experimental" or ...
- the new code will NOT be able to select the order of the fields (and 
also not be able to select headers, textquotes and field separator; even 
i will do that maybe in the source)
- the first version will be similar to the current default export. so 
just code simplification.
- then i will have got the chance to add new features into that code 
(like exporting other constraints)

331---------------------------------------------------------
From Zsolt Udvari (on forum):

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.
I added it (0. hour) and I saw the hour of all time constraints updated: increased by 1.
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.

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
(means there are time constraints) a new hour.

332---------------------------------------------------------
From Zsolt Udvari (on forum):

Maybe a user error (PEBKAC) but I think I share it.

So I've a little complicated FET-file and it seems the "An activity has a preferred starting time" doesn't work.

I attached the file and try to generate and check:

    Nr. 895 and 896 activities (without any teacher and student)
    They have preferred starting time: "Szerda 1." (Wednesday) and "Hétfő 3." (Monday) with 100%
    They have same starting time (day+hour) with 7 other activites (for example 647 and 648)
    Generate (without success)
    Check the student's timetable, go to "11A" and the 647 is on "Péntek" (Friday)!

333---------------------------------------------------------
From Valdo (on forum):

A new addition to Spreading activities uniformly in the week for activities split in to 2 components:

Constraints max days between activities (2 components) with the possibility to select max days and weight.

334---------------------------------------------------------
From Zsolt Udvari (on forum):

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.
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).

335---------------------------------------------------------
From Volker Dirr:

There are not many variables to mutex in the generation.cpp. So it will
be faster to use std::atomic or QAtomic command instead of using mutex.
(The atomic commands will do a mutex if the cpu doesn't support atomic
operations. so cpus without atomic support won't generate faster, but
other cpus will.)

336---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

Constraint min working hours in an interval.

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.

337---------------------------------------------------------
From Fernando A F Lordão (on forum):

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
another situation that occurs in my institution.
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.
So, I thought about including two more columns in the statistics file:
* "Total of Activities"
* "Different Subjects" (counting different string description of the subjects assigned to the teacher)

338---------------------------------------------------------
From mercurialuser (on forum):

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
happening, which activity is blocked by which constraint, etc etc..

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
place the remaining activities...

Liviu Lalescu:

For part 1) It is difficult, because I cannot rely on more signals. I already use SIGTERM.

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.
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
logs, and the maximum placed activities. The next one after the maximum placed is problematic.

For part 2) This would not be possible. If you modify the constraints, the whole thing is changed.

339---------------------------------------------------------
From Roberto Bergonzini:

Manual timetabling - drag and drop.

Just make a timetable view teachers, keeping only the free days and the not available constraints for the teachers.

Also suggested by mercurialuser.

Forum link: https://lalescu.ro/liviu/fet/forum/index.php?topic=3461.0

340---------------------------------------------------------
From Emiliano Llano Díaz:

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
file->open recent, but... you know humans are lazy 😁  )

341---------------------------------------------------------
From mohammed (on forum):

Nous voulons ajouter la fonction de sauvegarde automatique du programme, en cas de travail, l'alimentation s'éteint

(We would like to add the function of automatic save of the program, in case of work, the power goes off).

342---------------------------------------------------------
From Vangelis Karafillidis:

All students must respect the maximum number of span (in hours) per day -> better write:

All students must respect the maximum span (in number of hours) per day.

Circular -> better write: Circularly.

343---------------------------------------------------------
From rodolforg:

What do you think about leaving the version number and date out of
HelpAboutForm_template.ui ?
Maybe leaving a placeholder there, and making use of FET_VERSION and a
l10n version of date.

That will reduce .ts diff a lot and reduces translator efforts ;)

344---------------------------------------------------------
From V Paul C Charlesraj (on forum):

Minimum number of days in a week for all students.

Liviu:

Or for a students set. This is very difficult to implement perfectly (to take care of combinations with the other constraints).

345---------------------------------------------------------
From rodolforg:

(referring to translation of plural forms)

I also saw this in daysform.cpp :

        if(cnt_rem>0){
            s+=tr("%1 constraints will be removed.", "%1 is the number
of constraints").arg(cnt_rem);
            s+=" ";
        }
        if(cnt_mod>0){
            s+=tr("%1 constraints will be modified.", "%1 is the
number of constraints").arg(cnt_mod);
            s+=" ";
        }
        s+=tr("Do you want to continue?");

Maybe this part could use %n too?

Liviu Lalescu:

Yes, it should, also in hoursform.cpp and also in
alltime/spaceconstraintsform.cpp.

But I think there are plenty of places to modify and it is really too
much. But I'll think of it.

Problem: see for instance alltimeconstraintsform.cpp:

	constraintsTextLabel->setText(tr("%1 / %2 time constraints",
	 "%1 represents the number of visible active time constraints, %2 represents the total number of visible time constraints")
	 .arg(n_active).arg(visibleTimeConstraintsList.count()));

Which is %n? %1 or %2?

Also advancedlockunlockform.cpp:

	QMessageBox::information(&lastConfirmationDialog, tr("FET information"), tr("There were removed %1 locking time constraints and"
		" %2 locking space constraints. There were not removed %3 locking time constraints and %4 locking space constraints, because"
		" these activities were permanently locked").arg(removedTime).arg(removedSpace).arg(notRemovedTime).arg(notRemovedSpace));

It is very difficult.

I am sorry, but the code is full of such mistakes. It is too late now
to correct.

rodolforg:

Difficult indeed.

The only way out I can see would be replace:

"There were removed %1 locking time constraints and %2 locking space
constraints. There were not removed %3 locking time constraints and %4
locking space constraints, because these activities were permanently
locked"

by:

"There were removed %1 and %2. There were not removed %3 and %4,
because these activities were permanently locked"
where %1 would be "%n locking time constraint(s)", etc.

346---------------------------------------------------------
From Taro Tada:

Either allow two or more users to work concurrently on a unique FET file, or allow the merging of two or more .fet files.

347---------------------------------------------------------
From bachiri401 (on forum):

For all students sets subject Sport cannot be followed immediately by a hard subject like Math.

Liviu and rodolforg:

Constraint two activities not consecutive (to say that the situation A1, then immediately A2 is forbidden, any
other situation is acceptable).

348---------------------------------------------------------
From Fernando A F Lordão (on forum):

I would suggest the use of the current filter values as default values when the user presses the "Add" button for constraints.

For instance, I noticed the importance of this when I was inserting teachers time constraints (SCREEN "Constraints teacher not available times"). Let me explain...

As I had many constraints already set inherited from the previous semester, I was firstly filtering by name and modifying the preferences previously saved.
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
times I included the constraint with the first name on the list, having so to step back and remove the wrong constraint.

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.
So, how about we give a hand to the brain and inherit the values from filters to the next "Add" screen.

349---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

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
(or real day, for the custom Morocco and Algeria versions).

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
if this value is true.

350---------------------------------------------------------
From aisse (on forum):

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
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
buttons are in one interface as long Their number will be small in the Algerian version

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
schools, primary schools, private schools ..and institutes of very different types. The constraints in the Algerian version are general to all. But when we
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
can all be put in one interface ..

Liviu Lalescu: So you need a customisable interface (where you can add/remove buttons from the interface)?

aisse: Not exactly .. I suggested reducing the version .. to become " FET for Algerian middle schools...The buttons are fixed.

351---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

in the list of conflicts why not specify the names of hours with the days
ex: ... activity (A1) is in conflict with activity (A2) in Tuesday (2) and Tuesday (4) ...

the numbers (2) and (4) are the names given by the user at the hours.

one of the advantages of this suggestion is to know if the activities are consecutive or not.

Volker Dirr: You also need to see the duration, because you can only know then if they are
consecutive or not.

352---------------------------------------------------------
From Volker Dirr (on forum):

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
n_days_per_week), and other constraints, like min days between activities, which don't allow their data to be redundant (they allow only
n_days_per_week-1).

Volker suggests to allow only non-redundant data (like min days between activities constraints).

353---------------------------------------------------------
From Volker Dirr:

add a warning before generating (generate_pre.cpp):
check min days between activities constraints:
if ((number_of_activities.count() > 2*days_per_week) && 
forceConsecutive.isEnabled()) => IMPOSSIBLE

354---------------------------------------------------------
From Volker Dirr:

If there are activities in a constraint activities same starting
time and an activity is forbidden a time slot, then all the others are
also forbidden this time slot.

Liviu: It might not be critical, as activities with same starting time constraints are placed one near the other in the initial order
(problems might arise only if the user uses the advanced option "Group activities in the initial order").

355---------------------------------------------------------
From Volker Dirr:

If an activity A has preferred room R and R is not available
on some time slots, make A not available on these time slots.

(See also item #356.)

356---------------------------------------------------------
From Volker Dirr:

Take care of this potential problem: If an activity
A with duration >=2 has preferred two rooms, and in
the first hour R1 is available but R2 not, then in the second hour R2 is
available but R1 not, A is impossible to place.

(See also item #355.)

357---------------------------------------------------------
From Volker Dirr:

The order of the activities are not always good. activities with a
very low number of available slots might be much too late in the order.
(for example pseudo activities "lunch".)

358---------------------------------------------------------
From Volker Dirr:

Care about not available times if activities are consecutive.

Volker: the code might look like the attached (be careful: not tested much 
yet; so it might contain still bugs)
//NEW Variant (start)
	foundImprovement=0;	//TODO:delete
	bool addImprovement=true;
	//care about consecutive by Volker Dirr
	//TODO: same starting time and consecutive might effect each other. so 
repeat both as long as something changed?!
	//DO THIS AS LAST
	while(addImprovement){
		addImprovement=false;
		for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){
			if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_2_ACTIVITIES_CONSECUTIVE){
				Constraint2ActivitiesConsecutive* 
c2=(Constraint2ActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i];
				if(gt.rules.internalTimeConstraintsList[i]->weightPercentage==100.0){
					//if firstActivity or secondActivity has a same starting time, then 
it must be recheeckt?!
					int firstActivity=c2->firstActivityIndex;
					int secondActivity=c2->secondActivityIndex;
					for(int d=0; d<gt.rules.nDaysPerWeek; d++){
						//get times
						int firstPeriodOfFirstActivity=-1;
						int lastPeriodOfFirstActivity=gt.rules.nHoursPerDay-1;
						int firstPeriodOfSecondActivity=-1;
						int lastPeriodOfSecondActivity=gt.rules.nHoursPerDay-1;
						for(int h=0; h<gt.rules.nHoursPerDay; h++){
							int currentTime=d+h*gt.rules.nDaysPerWeek;
							if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
								if(firstPeriodOfFirstActivity==-1)
									firstPeriodOfFirstActivity=h;
								lastPeriodOfFirstActivity=h;
							}
							if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
								if(firstPeriodOfSecondActivity==-1)
									firstPeriodOfSecondActivity=h;
								lastPeriodOfSecondActivity=h;
							}
						}
						assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
						assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
						assert(lastPeriodOfFirstActivity>=firstPeriodOfFirstActivity);
						assert(lastPeriodOfSecondActivity>=firstPeriodOfSecondActivity);  

						int durationFirstActivity = 
gt.rules.internalActivitiesList[firstActivity].duration;

						if((firstPeriodOfFirstActivity>=0) && 
(firstPeriodOfSecondActivity>=0)){  
							if(lastPeriodOfFirstActivity==lastPeriodOfSecondActivity){
								lastPeriodOfFirstActivity--;
							} else
								if(lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){  
									lastPeriodOfFirstActivity=lastPeriodOfSecondActivity-1;
								}
							else {
								int numberOfFollowingBreaks=0;
								for(int i=lastPeriodOfFirstActivity+1; 
i<=lastPeriodOfSecondActivity; i++){
									if(!breakDayHour[d][i]){
										break;
									}
									numberOfFollowingBreaks++;
								}
								if(firstPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks>lastPeriodOfSecondActivity){  
									firstPeriodOfFirstActivity=-1;
									firstPeriodOfSecondActivity=-1;
								} else {
									if(lastPeriodOfSecondActivity>lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks){  
										lastPeriodOfSecondActivity=lastPeriodOfFirstActivity+durationFirstActivity+numberOfFollowingBreaks;
										assert(!breakDayHour[d][lastPeriodOfSecondActivity]);
									}
								}
							}

							/*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
							|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
							|| firstPeriodOfFirstActivity>firstPeriodOfSecondActivity
							|| lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("F1=%1   L1=%2   F2=%3   
L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity));
							}*/

							assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
							assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
							//assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity); 
// not correct that this position, correction is following now
							assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);

							if((firstPeriodOfFirstActivity>=0) && 
(firstPeriodOfSecondActivity>=0)){  
								if(firstPeriodOfFirstActivity==firstPeriodOfSecondActivity){
									firstPeriodOfSecondActivity+=durationFirstActivity;
									assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
								} else
									if(firstPeriodOfFirstActivity>firstPeriodOfSecondActivity){  
										firstPeriodOfSecondActivity=firstPeriodOfFirstActivity+durationFirstActivity;
										assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
									}
								else {
									int numberOfFollowingBreaks=0;
									for(int i=firstPeriodOfSecondActivity-1; 
i>=firstPeriodOfFirstActivity; i--){  
										if(!breakDayHour[d][i]){
											break;
										}
										numberOfFollowingBreaks++;
									}
									assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
									if(lastPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks<firstPeriodOfFirstActivity){
										firstPeriodOfFirstActivity=-1;
										firstPeriodOfSecondActivity=-1;
									} else {
										if(firstPeriodOfFirstActivity<firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks){
											firstPeriodOfFirstActivity=firstPeriodOfSecondActivity-durationFirstActivity-numberOfFollowingBreaks;
											assert(!breakDayHour[d][firstPeriodOfFirstActivity]);
										}
									}
								}
							}
							assert(lastPeriodOfFirstActivity<gt.rules.nHoursPerDay);
							assert(lastPeriodOfSecondActivity<gt.rules.nHoursPerDay);
							assert(firstPeriodOfFirstActivity<=firstPeriodOfSecondActivity);
							assert(lastPeriodOfFirstActivity<=lastPeriodOfSecondActivity);
							if(	lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
								|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
								|| firstPeriodOfFirstActivity>=lastPeriodOfSecondActivity
								|| 
firstPeriodOfFirstActivity+durationFirstActivity>lastPeriodOfSecondActivity  
								|| 
lastPeriodOfSecondActivity-durationFirstActivity<firstPeriodOfFirstActivity){
									firstPeriodOfFirstActivity=-1;
									firstPeriodOfSecondActivity=-1;
							}
						}

						/*if(lastPeriodOfFirstActivity<firstPeriodOfFirstActivity
						|| lastPeriodOfSecondActivity<firstPeriodOfSecondActivity
						|| firstPeriodOfFirstActivity>firstPeriodOfSecondActivity
						|| lastPeriodOfFirstActivity>lastPeriodOfSecondActivity){
						QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("F1=%1   L1=%2   F2=%3   
L2=%4").arg(firstPeriodOfFirstActivity).arg(lastPeriodOfFirstActivity).arg(firstPeriodOfSecondActivity).arg(lastPeriodOfSecondActivity));
						}*/

//lastPeriodOfFirstActivity>firstPeriodOfSecondActivity  

						if((firstPeriodOfFirstActivity<0) || 
(firstPeriodOfSecondActivity<0)){
							for(int h=0; h<gt.rules.nHoursPerDay; h++){
								int currentTime=d+h*gt.rules.nDaysPerWeek;
								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
									notAllowedTimesPercentages[firstActivity][currentTime]=100;
									addImprovement=true;
									foundImprovement++;	//TODO delete this
								}
								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
									notAllowedTimesPercentages[secondActivity][currentTime]=100;
									addImprovement=true;
									foundImprovement++;	//TODO delete this
								}
							}
							continue;
						}

						//TODO: only if this happen each day!!!
						/*if(lastPeriodOfFirstActivity + durationFirstActivity < 
firstPeriodOfSecondActivity){
							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("Activity %1 and Activity %2 can't be 
consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id));
						}


						if(firstPeriodOfSecondActivity - durationFirstActivity < 0){
							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("*Activity %1 and Activity %2 can't be 
consecutive.").arg(gt.rules.internalActivitiesList[firstActivity].id).arg(gt.rules.internalActivitiesList[secondActivity].id));
							QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("%1 - %2 < 
0").arg(firstPossiblePeriodForSecondActivity).arg(durationFirstActivity));
						}*/

						//lock times of first activity
						for(int h=0; h<gt.rules.nHoursPerDay; h++){
							int currentTime=d+h*gt.rules.nDaysPerWeek;
							if(h<firstPeriodOfFirstActivity){
								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
									notAllowedTimesPercentages[firstActivity][currentTime]=100;
									addImprovement=true;
									foundImprovement++;	//TODO delete this
									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("* Lock day %1 and hour %2 of activity 
%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id));
								}
							} else if(h>lastPeriodOfFirstActivity){
								if(notAllowedTimesPercentages[firstActivity][currentTime]!=100){
									notAllowedTimesPercentages[firstActivity][currentTime]=100;
									addImprovement=true;
									foundImprovement++;	//TODO delete this
									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("* Lock day %1 and hour %2 of activity 
%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[firstActivity].id));
								}
							} else
								if(notAllowedTimesPercentages[firstActivity][currentTime]==100 
&& !breakDayHour[d][h]){
									if(h+1<gt.rules.nHoursPerDay){
										if(notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]!=100){
											notAllowedTimesPercentages[secondActivity][d+(h+1)*gt.rules.nDaysPerWeek]=100;
											addImprovement=true;
											foundImprovement++;	//TODO delete this
											//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("*second* Lock day %1 and hour %2 of activity 
%3.").arg(d).arg(h-durationFirstActivity).arg(gt.rules.internalActivitiesList[firstActivity].id));
										}
									}
								}
						}

						//lock times of second activity
						for(int h=0; h<gt.rules.nHoursPerDay; h++){
							int currentTime=d+h*gt.rules.nDaysPerWeek;
							if(h<firstPeriodOfSecondActivity){
								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100 
&& !breakDayHour[d][h-1]){
									notAllowedTimesPercentages[secondActivity][currentTime]=100;
									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("** Lock day %1 and hour %2 of activity 
%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id));
									addImprovement=true;
									foundImprovement++;	//TODO delete this
								}
							} else if(h>lastPeriodOfSecondActivity){
								if(notAllowedTimesPercentages[secondActivity][currentTime]!=100){
									notAllowedTimesPercentages[secondActivity][currentTime]=100;
									//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("*** Lock day %1 and hour %2 of activity 
%3.").arg(d).arg(h).arg(gt.rules.internalActivitiesList[secondActivity].id));
									addImprovement=true;
									foundImprovement++;	//TODO delete this
								}
							} else
								if(notAllowedTimesPercentages[secondActivity][currentTime]==100 
&& !breakDayHour[d][h]){
									if(h-durationFirstActivity>=0){
										if(notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]!=100){
											notAllowedTimesPercentages[firstActivity][d+(h-durationFirstActivity)*gt.rules.nDaysPerWeek]=100;
											addImprovement=true;
											foundImprovement++;	//TODO delete this
											//QMessageBox::warning(NULL, QObject::tr("FET warning"), 
QObject::tr("*first* Lock day %1 and hour %2 of activity 
%3.").arg(d).arg(h+durationFirstActivity).arg(gt.rules.internalActivitiesList[secondActivity].id));
										}
									}
								}
						}
					}
				}
			}
		}
	}
	//end Volker

359---------------------------------------------------------
From Volker Dirr:

Care about not available times if activities are grouped (2 or 3).

360---------------------------------------------------------
From Volker Dirr:

Care about not available times if students early, no gaps and max hours per day.

361---------------------------------------------------------
From Volker Dirr:

The following code should be nearly perfect for CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY and CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR.
(For example 2 activities with CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY.
A1 only available at one day in the first hour and A2 is also available
at the same day also not the same hour and A1 is conflicting with A2,
then my code won't see that it is possible to disallow that hour also.

but I think that these are very very unlikely and special cases. I don't know
if something like that is in a real dataset and if it is useful to
search for such improvements, since those are more critical to detect.
This can be also improved if you care about duration.)

The code also includes simplified speedups for CONSTRAINT_TWO_ACTIVITIES_GROUPED, CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE and CONSTRAINT_THREE_ACTIVITIES_GROUPED.
These constraints can still be improved.

Before computeFixedActivities in generate_pre it is useful to disallow days and hours that can't be available:

QList<QSet<int> > activitiesListWithDayNotAvailableSet;
QList<QSet<int> > activitiesListWithHourNotAvailableSet;
for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
	QSet<int> dayNotAvailable;
	activitiesListWithDayNotAvailableSet<<dayNotAvailable;
}
for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
	QSet<int> hourNotAvailable;
	activitiesListWithHourNotAvailableSet<<hourNotAvailable;
}
bool notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);

while(notAvailableFound){
	setNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
	notAvailableFound=computeDayOrHourNotAvailable(&activitiesListWithDayNotAvailableSet, &activitiesListWithHourNotAvailableSet);
}


bool computeDayOrHourNotAvailable(QList<QSet<int> > *activitiesListWithDayNotAvailableSet, QList<QSet<int> > *activitiesListWithHourNotAvailableSet){
	bool newImprovementFound=false;
	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
		for(int d=0; d<gt.rules.nDaysPerWeek; d++){
			bool wholeDayNotAvailable=true;
			for(int h=0; h<gt.rules.nHoursPerDay; h++){
				if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){
					wholeDayNotAvailable=false;
					break;
				}
			}
			if(wholeDayNotAvailable){
				if(!(*activitiesListWithDayNotAvailableSet).at(ai).contains(d)){
					(*activitiesListWithDayNotAvailableSet)[ai]<<d;
					newImprovementFound=true;
				}
			}
		}
	}
	for(int ai=0; ai<gt.rules.nInternalActivities; ai++){
		for(int h=0; h<gt.rules.nHoursPerDay; h++){
			bool wholeHourNotAvailable=true;
			for(int d=0; d<gt.rules.nDaysPerWeek; d++){
				if(notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]!=100){
					wholeHourNotAvailable=false;
					break;
				}
			}
			if(wholeHourNotAvailable){
				if(!(*activitiesListWithHourNotAvailableSet).at(ai).contains(h)){
					(*activitiesListWithHourNotAvailableSet)[ai]<<h;
					newImprovementFound=true;
				}
			}
		}
	}
	return newImprovementFound;
	
}

void setNotAvailable(QList<QSet<int> > *activitiesListWithDayNotAvailableSet, QList<QSet<int> > *activitiesListWithHourNotAvailableSet){
	for(int i=0; i<gt.rules.nInternalTimeConstraints; i++){
		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_DAY){
			ConstraintActivitiesSameStartingDay* sst=(ConstraintActivitiesSameStartingDay*)gt.rules.internalTimeConstraintsList[i];
			if(sst->weightPercentage==100){
				for(int j=0; j<sst->_n_activities; j++){
					foreach(int d, (*activitiesListWithDayNotAvailableSet).at(j)){
						for(int ai=0; ai<sst->_n_activities; ai++){
							for(int h=0; h<gt.rules.nHoursPerDay; h++){
								notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100;
							}
						}
					}
				}
			}
		}
		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_GROUPED){
			ConstraintTwoActivitiesGrouped* c2=(ConstraintTwoActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i];
			if(c2->weightPercentage==100){
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
			}
		}
		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_TWO_ACTIVITIES_CONSECUTIVE){
			ConstraintTwoActivitiesConsecutive* c2=(ConstraintTwoActivitiesConsecutive*)gt.rules.internalTimeConstraintsList[i];
			if(c2->weightPercentage==100){
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
			}
		}
		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_THREE_ACTIVITIES_GROUPED){
			ConstraintThreeActivitiesGrouped* c2=(ConstraintThreeActivitiesGrouped*)gt.rules.internalTimeConstraintsList[i];
			if(c2->weightPercentage==100){
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->firstActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
						notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->secondActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
						notAllowedTimesPercentages[c2->thirdActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
				foreach(int d, (*activitiesListWithDayNotAvailableSet).at(c2->thirdActivityIndex)){
					for(int h=0; h<gt.rules.nHoursPerDay; h++){
						notAllowedTimesPercentages[c2->firstActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
						notAllowedTimesPercentages[c2->secondActivityIndex][d+h*gt.rules.nDaysPerWeek]=100;
					}
				}
			}
		}
		if(gt.rules.internalTimeConstraintsList[i]->type==CONSTRAINT_ACTIVITIES_SAME_STARTING_HOUR){
			ConstraintActivitiesSameStartingHour* sst=(ConstraintActivitiesSameStartingHour*)gt.rules.internalTimeConstraintsList[i];
			if(sst->weightPercentage==100){
				for(int j=0; j<sst->_n_activities; j++){
					foreach(int h, (*activitiesListWithHourNotAvailableSet).at(j)){
						for(int ai=0; ai<sst->_n_activities; ai++){
							for(int d=0; d<gt.rules.nDaysPerWeek; d++){
								notAllowedTimesPercentages[ai][d+h*gt.rules.nDaysPerWeek]=100;
							}
						}
					}
				}
			}
		}
	}
}

362--------------------------------------------------------
From math (on forum):

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
contains general information about rooms, times of blocks, teachers, lecture titles, etc. So I can directly start with creating activities etc.

The list of teachers is quite long and encompasses both internal and external teachers. Internal teachers have a full contract with our university
while external teachers are external experts that are hired only for one specific lecture, project or seminar in that particular semester.
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
in one of the following semesters. Hence, only a small subset of configured teachers is actually teaching within that semester. When printing timetables
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,
I usually take the easier way.

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)
When this option is disabled (standard behaviour), FET acts like it currently does.
When this option is enabled, the list of teachers in the timetabling dialogs (Timetable -> Teachers -> ...) is filtered, so that it only contains teachers
that actually have activities in their timetables. Also the teacher list in the printing dialog (Timetable -> Print -> Teachers) is filtered in this way.

---

Additional suggestion from math on this subject:

When selecting "Timetable -> Print" a dialog opens that has a dropdown list with potential printing types (e.g. rooms, teachers, subjects, ...). When selecting an
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"
and "None". By pressing these buttons I can select/deselect all items of that list.

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
timetable. For example:
- 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
with empty timetables)
- if pressing the "used" button in "room" mode, only rooms from the list are selected that are used for at least one activity
- 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
activities, e.g. due to internship semesters)

363---------------------------------------------------------
From pg788 (on forum):

I understand this might be restrictive, but a teacher doesn't want to begin in 3rd or 4th, since there is traffic.

364---------------------------------------------------------
From Dietmar Deuster and Volker Dirr:

Constraints:
- activity must start a students day
- activity must start or end a students day

Liviu: start may be possible, but start or end seems very difficult, maybe impossible. Please see also item #295, point 2.

365---------------------------------------------------------
From Volker Dirr and Liviu Lalescu:

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.

366---------------------------------------------------------
From Benahmed Abdelkrim (on forum):

My idea concerns this particular case and I fear that it can not be generalized because of the problem of specialized rooms and activities of 1 hour duration.

This idea is feasible for a limited number of student sets that do not have fixed rooms, and when teachers have to move from one building to another.

The following space constraint is very useful for very particular cases like the one mentioned above: min gaps between room changes for a students sets

367---------------------------------------------------------
From Anthony Siaudeau:

Is there a possibility to have tags to constraints (for example to activate/inactivate a group of constraints with one click) ?

Is there a possibility to activate/inactivate activities with one click in the activities windows ?

Volker Dirr:

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
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.

Anthony Siaudeau:

I understand the risks for soft users. Is it possible to add in advanced settings an unlock button for active check boxes ?

368---------------------------------------------------------
From Anthony Siaudeau:

I know an undo button isn't possible but is it possible to have a change 
history ?
When I work hard to optimize a timetable the generation time could be 
high. And few times, when I break the generation or when the generation 
is succesfull, I forget my last modification. With a change history it 
could be easier.
Maybe such history needs discusssion about the level of details 
integrated for each actions. For example said "activity n° 1234 had been 
changed" had a lack of information while "teacher alpha had available 
time changed monday hour1, monday hour 2, .... friday hour 7" will 
probably be too much detail.

369---------------------------------------------------------
From George Milliotis (Corfiot) - on forum:

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.

I generate schedules for undergrads, postgrads and some special course sets and I have to generate them together so the rooms/teachers work out.
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.

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
generate schedule html from those files. Although that would require some extra steps.

370---------------------------------------------------------
From George Milliotis (Corfiot) - on forum:

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
students can eat while the restaurant is open.

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
schedule breaks.

What I'm after are "soft" breaks.

371---------------------------------------------------------
From George Milliotis (Corfiot) - on forum:

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
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.

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"
constraint is the problem. This would save me A LOT of time.

Eg:
Activity #111: Blah blah, teacher blah, students blah
  TIME LOCK (day X - time Y) PLACEMENT  FAILED BECAUSE:
      this rule
      that rule
  SPACE LOCK (room Z) PLACEMENT FAILED BECAUSE:
     this rule
     that rule

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
is easily detectable as the culprit.

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
a time-locked activity.

372---------------------------------------------------------
From satellite2 - on forum:

FET has the option for selecting buildings of the rooms and assigning very useful constraints for the teachers/students such as min gaps
between building changes and max building changes per day/week. Our university has 3 different campuses in the city and they are really
far away from each other. Sometimes teachers and students need to visit more than one campus a week for different courses. So with the
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
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
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
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.

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
"campus" or something else? Also similar space constraint for the campus variable such as max campus changes a day?

Liviu and satellite2: maybe add each building in its own campus.

373---------------------------------------------------------
From Jude G:

  *   Importing comments to activities / students / teachers.
  *   Option for having full names and codes.
(so teachers, students, ..., will have two names: a long name and a short name).

374---------------------------------------------------------
From bharatstank (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3989.0)

Room not available constraint - wherein (X) crossing the specific slot means No activity is placed in that (X) slot.

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
Message to display.

There are few Activities, which are not time tabled and are communicated back to the concern department by simply (X) the Class rooms slot.

375---------------------------------------------------------
From satellite2 (on forum): (https://lalescu.ro/liviu/fet/forum/index.php?topic=3996.0)

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
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
than two activities a day etc.

376---------------------------------------------------------
From Volker Dirr:

Disable energy saving mode, because FET won't calculate anymore if
the computer falls into save mode after x minutes.

377---------------------------------------------------------
From Nagendra (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=4050.msg21599#msg21599

I request you to enable multi-selection (using 'ctrl' key) and range selection (using 'Shift' key) in time and space constraints also. So that
anyone can enable/disable/delete many constraints at once.

Also from ChicagoPianoTuner, he suggests selecting and removing more constraints or activities at once.

378---------------------------------------------------------
From CarolStott and Volker Dirr (on forum):

- A teacher-subject matrix to enter teacher qualified subjects (so you
only need to enable/disable a cell in a table)

379---------------------------------------------------------
From Volker Dirr:

In the "Add activity" dialog:
Under the word "duration" (so left from the "active" checkbox) there is still
enough place to add some useful information.
I suggest to add the currently computed "Total duration".

380---------------------------------------------------------
From Christoph Voelker and math (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=4068.0

They refer to the selection mark and the colors in the constraints activity(ies) preferred times and activities occupy max time slots from selection.

381---------------------------------------------------------
From Nagendra (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=4085.0

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
will be much more appealing.

Stage-1
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
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
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
drag and drop kind of thing.

Stage-2
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
different subject. By showing both teachers timetable side-by-side and highlighting the boxes of teacher-2 upon clicking the lecture of Teacher-1.

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
swap requests.

382---------------------------------------------------------
From math (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=4102.0

When selecting "Timetable -> Students -> Days horizontal", the timetable dialog shows up. When selecting "Year" or "Group" in the dropdown combo box, the
order of entries corresponds to the order of "Data -> Students -> Years" resp. "Data -> Student -> Groups". Hence, if I'm sorting the data entries there,
the list of entries is sorted in the timetable dialog as well.

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
"Timetable -> Students -> Days horizontal" is unsorted as well, when selecting "Subgroups" in the dropdown combo box.

Would it be possible to sort the list of subgroups in that dialog by default?

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"?

383---------------------------------------------------------
From Nagendra (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=4104.0

Add a constraint to limit the maximum number of subgroups (or number of students?) in any given time slot.

384---------------------------------------------------------
From Diego Froner (on forum):

https://lalescu.ro/liviu/fet/forum/index.php?topic=4128.0

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.
So, after all the imports, i have to set a home room for about 350~400 classes manually.

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
add the respective "A set of students has a home room" constraint.

Example:

Year ; Number of Students ; Home Room
ClassA ; 10 ; Room 01

This example will set "Room 01" as the home room for "classA" which has 10 students.

Volker Dirr:

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
b) we should add all constraints in that files (not only home rooms). Similar to teachers and rooms.
c) Because a) and b) conflict each other we should add a second csv file format.

385---------------------------------------------------------
From Volker Dirr:

Split year dialog: It should be possible to sort the group names. I think manual sort (by using "up" and "down" buttons)
will be better than only alphabetic sort.

386---------------------------------------------------------
From Ireri Venture:

I would suggest you to add the constraint minimum continuous hours for a teacher.

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
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.