From 3b009a3ba0e10697aa0c2ba7da5df0ff4fe72d39 Mon Sep 17 00:00:00 2001 From: Ayham Mamoun Date: Mon, 21 Jan 2019 06:51:33 +0300 Subject: [PATCH] Update! --- .vscode/tasks.json | 6 +- T.T.B.G-API/core/CDABNG/TimeLine.h | 18 ++++ .../{SA/TimeLine.h => CDABNG/_CDABNG.cpp} | 0 .../core/{SA/_SA.h => CDABNG/_CDABNG.h} | 0 T.T.B.G-API/core/SA/_SA.cpp | 0 ...ock.CLASSES MASTERS TIMETABLE (copy).xlsx# | 1 - .../CLASSES MASTERS TIMETABLE (copy).xlsx | Bin 7453 -> 7453 bytes dummy_data/CLASSES MASTERS TIMETABLE.xlsx | Bin 7688 -> 7689 bytes notes/CDABNG-Algo-notes.md | 84 ++++++++++++++++++ notes/README.md | 3 + notes/timetable_making.ods | Bin 0 -> 9013 bytes 11 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 T.T.B.G-API/core/CDABNG/TimeLine.h rename T.T.B.G-API/core/{SA/TimeLine.h => CDABNG/_CDABNG.cpp} (100%) rename T.T.B.G-API/core/{SA/_SA.h => CDABNG/_CDABNG.h} (100%) delete mode 100644 T.T.B.G-API/core/SA/_SA.cpp delete mode 100644 dummy_data/.~lock.CLASSES MASTERS TIMETABLE (copy).xlsx# create mode 100644 notes/CDABNG-Algo-notes.md create mode 100644 notes/README.md create mode 100644 notes/timetable_making.ods diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 3f30d6f..9fadff0 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,7 +2,8 @@ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", - "tasks": [{ + "tasks": [ + { "label": "C/C++ Build", "type": "shell", "command": "clear && make", @@ -24,6 +25,9 @@ "label": "C/C++ Build One Time", "type": "shell", "command": "clear && cmake . && make", + "problemMatcher": [ + "$gcc" + ] }, { "label": "Clean for GitHub Push", diff --git a/T.T.B.G-API/core/CDABNG/TimeLine.h b/T.T.B.G-API/core/CDABNG/TimeLine.h new file mode 100644 index 0000000..8df58c0 --- /dev/null +++ b/T.T.B.G-API/core/CDABNG/TimeLine.h @@ -0,0 +1,18 @@ +#ifndef TIMELINE_H +#define TIMELINE_H + +#include +#include "../data_defines.h" + +struct TimeLine { + vector> *__slots = nullptr; + vector _teachers; + vector _subjects; + vector _levels; + int _period_cnt = 0; + int _class_cnt = 0; + + bool Check(); +}; + +#endif \ No newline at end of file diff --git a/T.T.B.G-API/core/SA/TimeLine.h b/T.T.B.G-API/core/CDABNG/_CDABNG.cpp similarity index 100% rename from T.T.B.G-API/core/SA/TimeLine.h rename to T.T.B.G-API/core/CDABNG/_CDABNG.cpp diff --git a/T.T.B.G-API/core/SA/_SA.h b/T.T.B.G-API/core/CDABNG/_CDABNG.h similarity index 100% rename from T.T.B.G-API/core/SA/_SA.h rename to T.T.B.G-API/core/CDABNG/_CDABNG.h diff --git a/T.T.B.G-API/core/SA/_SA.cpp b/T.T.B.G-API/core/SA/_SA.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/dummy_data/.~lock.CLASSES MASTERS TIMETABLE (copy).xlsx# b/dummy_data/.~lock.CLASSES MASTERS TIMETABLE (copy).xlsx# deleted file mode 100644 index 9d23999..0000000 --- a/dummy_data/.~lock.CLASSES MASTERS TIMETABLE (copy).xlsx# +++ /dev/null @@ -1 +0,0 @@ -,ayham-mamoun,ayham-mamoun,18.01.2019 11:09,file:///home/ayham-mamoun/.config/libreoffice/4; \ No newline at end of file diff --git a/dummy_data/CLASSES MASTERS TIMETABLE (copy).xlsx b/dummy_data/CLASSES MASTERS TIMETABLE (copy).xlsx index e2b038f1b85017c115af357ce6bb198373d72c11..d94269c265ef5fb70b05da809916c93210b5c894 100644 GIT binary patch delta 143 zcmbPhHP?zez?+#xgn@&DgJI)FZb?SQjhj^&m6?E)CvyY`kXpp;0OCF7?PCQ}MZ#(z zB{M}DK$Mi&SrGL?ToXhINj3th$y21b36qRuR Sl3_A-Kys>#Es(q{;{^a25H2?W delta 143 zcmbPhHP?zez?+#xgn@&DgF$~Iw}3W0KjDv zU_=#>;pW}7H3zuyJii4wpBGLf&(upswYSq)>p~ve1s4$*?$|PuoDcb^lbNPs;8fRT@3=@seQERf3z1H`vigXV- z{$TqACSinvic6T(x|GKfsfgBe9sKH_K9n(Tq1v~SX40B$iQvC@t4HGE}+-stfdV{<&pHOhZ z5svqt+r%=#=fh=mlvtGoRyobuDM%IwUO&h>fk9oWZ?EwUFT~vFHc2gH3-!o)5}+61 zDgI*gE22KGU}Ejrt-j9e0|~i8s>uN&)bvLde&ICp3$9P5}}|K^c(Gs(f>dZ?Q`Lql;WoP8|2 zvYFhF$|UO^uIs)N6_rg2Ww)dC?AV5GO)WOxJfxUdA{GU*icQnzu?YA=(vVClM*6&e zdgGv$L5%05Kl{`8lH5`Fhs3Nh&670q&kA2m!s%rZI)4~(3=0*}K4kVroT;;+RoGoB z-@LfTk@G+jfJYlpt|TsY(;&%7LEckJUVH!Mw>p)}N%4Qh0?sJf!v4G`&IcCvuvLtC zA;^OR5W9G%;I_Sy4zFz_lof47@BYtjS1&{&BupZtO0LMLy};L*tF`;H@(^@rpd^gF zVzBvvr&7Gk<Bm_e2Z(6}JTYe3Alwn|6JCfn&uFpwx@s7+n>J7tWH5gQ*Xu_? zAf8r`J6wOfD}DB%O;UVMg|y&E7NK*H##Hbc)OeB4|IQncSoKchg&a4xa-53L-LXuX z6bN~Nf6fiA$<5UGfW3S#2ImOUQjO`ne3Oc(e$4Pr^ z&>B={NCa1v?=eRfoL2SRv&r?c)7b4a@f=}rhGaFr<1s!R1JDKExT1scGorL^N5_V( zHe?PJZY<@Yc)$vo60p%{(R*f_1oeI*ygOZk_GCzunkhP-PPa2=w7Hwe&4)P9@I31~ zy;mjd8Ndf#e8lxJ!J>0>Awx1+lFTHpa#UJk?257s*{{N{R$x^*5UjB9ZQ1x$SL4iJL(E@F# z;>QCqQ+Pd zK0YAnEzfn<#w|kI;&~J8wF>?Ac^I;00_~CLuW2(}{==uk&pmBwS^X4wir1E5u3({& z*V!;H^l(%g?F~2VsEHFfT?WJMmxBxzq!han9kGCNwJa^kyJ%J96`Oh+o{B?`xj?`1 zU_X>P9R}hS{Y zhB~33cKWgwa&7TKqe%BXrX&f70s;3F#pzTleo87(jcr`qr$+qX{~%DQD0#?EbSzl> zrIi$aSfz5u$?DW%A-Shx9ctx?a~>{s90%iCz3c`L3|4WaDgOKODs=)H)vp_#QnW8V zYk#7CEv;Y9&L9GhMul=dd#Xk}zfjAVxS{yLfJ(mz#XDyJ1+lJoCk8G|R?a9Xx?HlXx3wBGM z7DHCkt-G>Jui;u{RN35MZkFJV*+@w%r-SWNiplt_tvmF&}%1)Ye@6Kz% zkHpJy%huJj&F|jR^w`t*_1f!T2jQ!9Yw!)(tD^nH4g>MF`*Dp?GNW2!O-V14B4){( z!z(Tr`{f|<1oyiz)CM-MIdFTK{S0ta9^1Y$o_T7m6`reF`2Jzh09)g=P(`kvQJ1ID z?Ak`R9&(jp(B5Qr!cbNsf`0UzDT{<&vLt9hz+R+fR-@Synsrl_wA0vjA=abrVB>hX+yRr6uzi%SWIN6Vi=q66lJX19?ZhNH9QKgRtWqrdj~-{&{w zxZD9hV&RrB4oL!o_>$;MYD$un&H8*%d9D^iZZOAk_{Og$#LgH7MVxtsD7zd~>C-uv zlN}jd`()nXl3+XxC)Y6;c4pY|nc3y73)5b6pe?CtO)=S_lf@`V7ow{hQL~T*bTg)P zl%il;sU_XnuGM`dnB4kTaUND8mBSbuHIDP8$Y_mfU44)v;NmC%_?)Y*Lj`bgtsUgz z`XAz{$q=^MBb}N7(YSqk?Bfkm{TqUANk{Jq@;(_gB7Rg+ymkGwZ{wvSmEJj2R_Q2% zQQ$-GEoLM?sI${n;$IwU*Lw{{L7W4g2TodDn>5TX%spgrGwkVrQ5Qc5^8n+i*_v0B z&;!$TnQ!UOeBvo$6w044&w5;H>{So`=8t=EeV?w7?MN`z=hHxBCouSjwA?g5smLyP zbmWf>V(JLYz;+vKp=kc-67!}^=3>lI8^3hr=40-L$lTTn3(_&kCq>)~unW9@Y=<2F zi$3o6Nh|Pv@{cRLrlnB^ROjPrGfM<0Gy!(-ZQtv@fspZv#LN_T;%fSqV^R(X*LN2y;NXv|QDppyN1!(r!uk{zj5_QDj*tMaR$O{Gkr> zWXN5?QLuh zN;G@;Y$@s;MT!BZ5Mw$TI~k3x>kB|de+&Hba!qu-!sOdtcLBsO-(=dC_%y*5!I2Gb zhl!sbuiHPp%fw-06H=f`C3g3vUVYoNlq4W z^miHr!K)!tX~YTr!ISqTTKK(RNu_Q{3<+%Mxe2V|(b3=UQ5X5Xci3x7@IC%mEvDfg z2)+Hhe#JS_y302?-9uTzb2(><6)xZp85}e1emS^-mA7(V=$~+x;kDbG76P55Lp?2z z(?4Hlu+>uDu{0=aB#brLmmy1oVPr5G%h>smZ7?RgNDIl>NeS6w zq-eShzJ?;q!!=ic+2`+U#2&-3|9HC~m)6i!3S2>=3tfRFO>WEO5J zn%}lsoC-tz$4Sqlk-}q&8`wizTG~2}YLgC(Ri-}4b(VStRtG2q*Dt@8(@lQbI>W3y z{s7TJV57xe+EOLC3PF5BCZu;gYQgtGEytnn#3?n;s;e55-Yrd#25(!H+HCrxkAH|A z)}sxVA(BI2S!NtMyQZ0z_w+Qxr~9gbOz>wa@QeAfh`ufUxQ1aBZiAhOxPy$134%8i!l+%~@tFwanW{(R zeLUfQSV_V4H_Xlkh#P{d;(DaNym|Qgk!oqV^I5OUi2+#IV!Jx$W5WWEfw8t(HWxG0 zXN{M>m3aHg)Zsb2P_wGau)UCnKei%g>%fW#i!%<_CYIKiHgTz^^h}p0t)MOATLQN8 znBP=5+A55E3r$nZ@*>}u-I+q88|eE;tCyT@INUqj@A7y8rhn+Uo< zBDiR;0n0_%w47)nq-p1?n1FYJ6q@0> z6Y|Ye?d!bULqY3V?9ZY3NE;}RqDX9kEuOwW2gd}QGr0MVicUu^Bf~j{!Py?(>kEid z)+O9#l~7NG&q@GrlI0|)roY6xw4y*PIb^P_&%}oIk+z|A#AtU{9{qb3v5pVOd6%Sc zKw4WGqwbpSEMr0ml*aEOkyF@%6RB9$6Oi=D;9#4bj_I!%C{qQT)4qQV+8~pLZ%be- za}0Njb~Bk}G$^U0W=3ofbyV5Vp7T@I!enZ9^{CMwH?Fy=Tbmkm3rIiv@e&vVy%HjC`>wEGih3LWQhquN}IOV=w#O7%LlaA{@wbr!HsF}O6P z#FW7Oz+keJ6iDmH?)zbLBLV#UVNowTd*2}=nNt8vY|CQksH!Y{8-3dbo$%=;le7A^m-e>6w%!EE(9cD?Rx5_TaaG4kP~ZHEcBUvv-Rn_3 z0OAin-*mHnNpD~lGI@_fuppoQy8=vyh?YK($gbM?TAVn--Qq=PJ)+&iTC4bC!+MHp?o&MtIVW6~Cl z9pOoU*0c_SwB_z$5Jvt-%W{O~NvN&shJrHyWA7)k#aKZAFUc>VNMD8sKE@6l9m%{9 zhmtDS_5zMuM3f?a+W?;IUh}q>EofPQTUPr@Q>_d>#j~VfJO*P`AILx1xMvkj&hrvZ zNLjT%ipHWAKUpC<11mzyTv3Zn;&#PXM_;ST)nQhHsa&p}bTci6y2fm)SGC;}wwY~C zDfgYaVX3@+;ZpAY6qgSy=<>c^nfTqdLib}#YgSPwKu`crJ)39~Z-*s6YFmA2-Aqyn zzT9G;`>Y%(WIWg1JFm$RHd4BlbFzcGMSDJ_25~6Vd-2E&WJGv@d_TCnE7Gm-JR7C- z)=r^%Z=(;bzndY~(x_}AU%-B^O~+B`>tBdX)dO3YR0H*5-`%^0G1DrgOO(7{1#;tA zZpFWlBf<@Ml>*4)d7ZMZ6$UO@-0-Rgd%DKT_#KPM4f6{v1u2Lav0}B{3)B6uuiki{ zc9L&3YbMgn_BAKsY)z1p+MQ)9-tP^{tp4cS-e*q<<<5CM>67({#GMz~BRh+s5Rc3= z#=|Ql)v~Q_R?zUVlVNKm#^}OWlgy=H#y0a#VbFj*BI+bzrPsW(meb<{y&U^ycFA}c zh4v!f>`bkZ;Bji{_r+0HgiNoZH!CwagwMXZZ{#-f{;2kyl{$^e+G7S&I0Fy^O3@($ z0f3#$0KoqcPj$u_^;6QR9zGjGcgj8voZ!D9D4Hwm)Jdn~7Q>r-fwH|?e-R&o{Ye$` z(KG5>g>rK`bf^Y2Ur;r6Cr9sJ5Kt}1Awbj+x9 z18QMqyiE>{GwfXIdggtl3Q%pkjc?_Lmn|%x474VFmue_%aMDq1ZqoD z>8FIep_F<+MW!ge)aQEntrvcD(dM{ow!kW)76BaZZK)I7W9z2>GSEoY^b$2ojZ>sJ z>TNgP2QYdV#S;3Jrh3@fYgQyc!hP@M=!1rFlx|LOKHuV<`L$)g_b(D^^(`eehy69; zP0zZ9H^o!m-k&i25xjFm*`l_{tui-+zZ)kc)5&&h_OxfPb023iKfvB%EJHUr*tT`Ehp*re5v}!!`Gg|>VckPtuJx0WqI`65Cl!iyQrUY5 zbvKIr1LK0CH&lksjkOUi;&$WHt3e9U5b8$CgkL$A%Zxj2C1@2Ew72FM%0c$kWuOwy=QH7~J3bR2)!yI}J$LxgY7&z-Won_HKTKi!U|}8=5S?MPA=rrK zdHSZTFlib){|f)qs-#!q6%iKnt(#YVJpSr0;;rAdag2voo{7KAmVc1%q@J|&`{)}1!QY><2 z$99kE(P|P6*_!z4`eql;b2D~0__kLdqaz+WSm)ed^?*{>Y4Ug$GkkXSVG}P;FDs%j zReoV?#Y5h56l09Oo9h_GG5tpii1M!23IG5I{jJC8hy(vk^;LZMzvnoT|N1G^_wsA7 z{Dynu|NM${kbuhR$xVSPr#3}E`R|(ouv1GTsLuE&<5ci;13{SZpXi?@*?yP)@9Iu3 l5EMSmY!&3E-r`MX<>LaG!s+P$Tw(gX!>IuPKmI?_zW^{@=PCdI diff --git a/notes/CDABNG-Algo-notes.md b/notes/CDABNG-Algo-notes.md new file mode 100644 index 0000000..54bcc24 --- /dev/null +++ b/notes/CDABNG-Algo-notes.md @@ -0,0 +1,84 @@ + +This is the specification for the 'CDABNG' Algoirthm. + +First of data representation: + + Code Representation: + struct TimeLine { + vector> *__slots = nullptr; + vector _teachers; + vector _subjects; + vector _levels; + int _period_cnt = 0; + int _class_cnt = 0; + + bool Check(); + }; + + - The data will be represented internally as a struct. + - A vector of vectors, called __slots, will be used to represent the timeline. + - __slots will be row-major, __slots[0][1] will be the 1nd class, 2nd period. + - A counter would be used for the periods, since not all classes will have all subjects. + - A counter would be used for the classes, since not all classes will have all subjects. + + The vectors will be the type of 'Slot', a slot is a struct that have a value called teacher and subject. + + Conditions of a Slot: + - A teacher may be the DEFAULT_TCHR which indicates a slot/period where the teacher may be not defined or arbitary, that is if and ONLY if subject isnt DEFUALT_SUBJ. + - A subject may be the DEFUALT_SUBJ which indicates a slot/period needs a teacher and not a subject to teach, that is if and ONLY if teacher isnt DEFAULT_TCHR. + - If both, teacher and subject, are defaults this means that the slot couldnt be made by CDABNG or not specified. This condition will be named EMPTY_SLOT. (Such as the 8th period of level 4A, refere to dummy + data/CLASSES_MASTER_TIMETABLE.xlsx) + + All vectors of the __slots must have the size of _period_cnt, or the TimeLine will be marked as incomplete or not correct. + + The _teachers vector will contain all of the teachers. + The _subjects vector will contain all of the subjects. + The _levels vector will contain all of the levels. + + Between c++ classes the TimeLine will be passed as a pointer(for optimizations), + instead of passing a individual vectors. + + Check(): + Returns if the timeline is valid. + + A timeline is valid if: + - Its _levels.size() == _class_cnt. + - Its _class_cnt == _slots.size(); + - Its _period_cnt == countof(_slots[i].size()); + - If a condition is false all of it is false. + + __slots is a pointer. + +Then the "CDABNG" algorithm: + - The parameters: + - A TimeLine struct. (Will check of it & pass by value) + - A value which is the 'Vision' of the generator, range: 0.0-1.0, perecentage. + - A value which is the 'give up rate' of the generator, number of tries before giving up, should be more than the number of teachers by 15%. + + - The algorithm will have three parts: + - The PREFIX. + - The Generator, also split to two parts. + - The POSTFIX. + + - The PREFIX stage will: + - Pick the subjects and track each one to a class (Filtering). + - Pick the the teachers that can teach what class/Level. + + - The Generator stage: + - Two stages: + - Generation proccess. + - Checking process. + + - Generation Process: + - The generation procces will generate the slots incrementaly. + - Uses the data given by prefix stage. + - Takes in mind, in every column, the above columns by a percentage of the vision rate / 2, also the below columns. + - Gives up checking for teachers when it reaches the give up try. + + - Checking Process: + - Makes sure that the empty slots are not makeable + - Makes sure that the non-empty slots are valid teacher subject level combination. + - Makes sure that every class gets one of its appropiate subject. + + - The PostFix stage: + - \ No newline at end of file diff --git a/notes/README.md b/notes/README.md new file mode 100644 index 0000000..27f793f --- /dev/null +++ b/notes/README.md @@ -0,0 +1,3 @@ +This folder is for making notes about the api, algorithms and gui specifications. +May be outdated. +Should not be used as docs. \ No newline at end of file diff --git a/notes/timetable_making.ods b/notes/timetable_making.ods new file mode 100644 index 0000000000000000000000000000000000000000..68399057d463460c481fa734189c31d1a4643415 GIT binary patch literal 9013 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 L2|Cpzx8ME?|68}` literal 0 HcmV?d00001