From 9c270a690b0addbee175f46153599c08ce137184 Mon Sep 17 00:00:00 2001 From: Yash Ugrankar Date: Fri, 14 Oct 2016 20:24:55 +0530 Subject: [PATCH] Implement class CacheUtilisingGenerator Issue #9 : CacheUtilisingGenerator objects use an LRU cache to obtain a balance between the space and time complexity of the program. --- ...isingGenerator$LRUCache$LRUCacheNode.class | Bin 0 -> 1343 bytes .../CacheUtilisingGenerator$LRUCache.class | Bin 0 -> 3736 bytes .../generator/CacheUtilisingGenerator.class | Bin 0 -> 3178 bytes .../classes/random/text/generator/Gui$1.class | Bin 0 -> 515 bytes build/classes/random/text/generator/Gui.class | Bin 0 -> 2089 bytes .../generator/CacheUtilisingGenerator.java | 184 ++++++++++++++++++ 6 files changed, 184 insertions(+) create mode 100644 build/classes/random/text/generator/CacheUtilisingGenerator$LRUCache$LRUCacheNode.class create mode 100644 build/classes/random/text/generator/CacheUtilisingGenerator$LRUCache.class create mode 100644 build/classes/random/text/generator/CacheUtilisingGenerator.class create mode 100644 build/classes/random/text/generator/Gui$1.class create mode 100644 build/classes/random/text/generator/Gui.class create mode 100644 src/random/text/generator/CacheUtilisingGenerator.java diff --git a/build/classes/random/text/generator/CacheUtilisingGenerator$LRUCache$LRUCacheNode.class b/build/classes/random/text/generator/CacheUtilisingGenerator$LRUCache$LRUCacheNode.class new file mode 100644 index 0000000000000000000000000000000000000000..2ac38c38db69f4746bab92caa744990c9048948b GIT binary patch literal 1343 zcmbVLYflqF6g|_|mRep#iYN*wY9GLA;^RXJiD|?b8ceKU{J1S+S+eYs=@#T)X(A!f z#2?^~GM<@j8#LP(`7(3o-h0kH_s-1EU*CQJc!EbcSXdcD2KOyI$RUY``cSe^wonnU zP6M^ym7&05LplC_aAb$_Q)qXjFO?Gp%6`v;rVMKW6CVT53r=0XV?YA4jYH?ev3sHG z*)NoG&Kho4Cyq7Uj_-s$B?ZcHIUAAFbNr6o3>6t`o5ZD#l{~SqDv)iw-K{(A0}|w4 z`;=1moNiZkc^pJ`f_+9`j!mG{V0H^L?xt}l0bM=hz|IW3P;3yq-dczcd=^||j%g$FLXD*hQeJ08Thuc9M% zyjokXBg1|J0?VcHKYA3HCSYrD>l#U|bHv5pdo?~1D~Dp5K~J^imaB)eFyg}2b)`IJ zv6e>`V*)cVrFDEgj~uQE)Z<_A2>RhO7#h*Dnle?)`+Uga5>l_b&XZl$zWrio}~zloBbL^qe3uJG&&Nv zMLSPDk!PHBBV`Np+{PV7v<{oQ&Pi9kBJr6e+A%YG&e`uf-*?XM+_Jy?{^L&o zp2U|iY{WIb+i3D!Ep+YrrT@3>t+V1<_$^ z+&0{jL*41WYiv(BhMmdhx?J|lHul^u4BA)*mQdq+4fu;p(U$m+2i}l$2OFG zn-j#zo}KhVoiL4zg1!ICg}kn4T_7T5KSPx^3P##;rxk>^TejuyEdUW`_x zEZZC^<;G0sh%uJsxrS6eZDfxcjwSEGqUugq4Di+^x=4_#j6%V*GXnZZK4lf%0T1** z+Y+x_7)C*)xn{0ld#J)zvA>kfDhRc;A6HN}>>BBpnDhWmUB=9suE~t}g+eXwykTYi z^Iqi?O;^FXMcgYFfr4e}yzLs6T|8(q%&m*zDIXAjVn!wtyeoM6ekUp_bGPFd(-OQM zad`RJd^Ve(VwFv?B$=MoRaF%#j>qwsjxHfdbn19j$ZJAg$3-1);7uLR;w=Sz z)o0Nn_UD>oPLM(uyZdx(#||C4(5vGaY}4^JE{To3I^Gd$LwGlW_jJ6E4-{;QCFg&h zt(I~?=GT+S2tL&D5k6M%fCsjsboP|2Y{q2VbpN=_rfn@cKEbC#KI5E<>G&L%71Zv{ z72IiA{X#)aM~i}ul|~koBe=rCSz3G))X#f-XzZMsX3wiO2R>QBF(;XDmg!uxu5W9< z??4DUW-dR;>e$p)(MkU0Jwg3?5ek;rx78FmCqji1{n%P%_g`KdqVG%!ot`hk`5CeR z{P1*<^OH97Vl$W|R=(@7v;xO~Y2?^ujov*Am-$EQ^-I?N3zA@XNUw+e>8~JJ38t)2 zfyQ47s)h#F^55zowlz2JpWq)%8D&NF@qz^gt0dvC29y7(kkGkJ1q}vmnf^UXD_vgADT!LwSfm4-@EfH26Gr zV%YPp#Wx#xr;+dW04K1D;py|BagELZW&}*#e#Rj+35X6`sVycoD5Q#S%ZwERWI04E;NcgP6bwEUupO z(8PT|=g^!9(9m}bU_bFR;eb~sA#(73sSepY$URB;GN}4JbViVhsX=cIQfY`e@q=-h zT+-hiXHXlzLalOxC?&$Hen#D32eZzH^`HrpSBV7!wUPy}`UX$>b?29N4l&qts(|%) znO*F#jfxf7?w*6v9YAT~43I+i-3{^oEO7HM-F&WGrAj@`Ncyk+fTo5AX7C{S9XvET zi!}|+GgwQX!!vle;StI+SVslPRZ7TRESEzqT)U1_^XH_JXRyAZl}9MArtF`TYEOB+ z{T(|0t^V~teibW^(u(xFACykUADCh*oacC(Cd>;&^eWQ)NSWX_N&y#fg`X*3^E2XG xT&k$xYeAqoG0B#ZIUw1LA#@MDOy=e-jK(lmYH$Rb$r~tbpoLAeRY$1}+Mi3@h~xkO literal 0 HcmV?d00001 diff --git a/build/classes/random/text/generator/CacheUtilisingGenerator.class b/build/classes/random/text/generator/CacheUtilisingGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..5aea213f7b4c89543562306810024100ae328ecc GIT binary patch literal 3178 zcmbVOU2_xH8GcrhEnCQZ2n-2<+Rn7O=;VXRO{UYC-lm;kPs>bxKri}pdeNDFJZB{vF^FN3@p$)qyytnJ_kEu| zum17hzkd(lG};C1z+4`0=TR*ngLfv8#RWT>w~vc?Tq9Xl3s}Yt2NShx%T?*Nm4o6!7^=7$$RtsTgVH+}=I54c*Y8y4 zs+TU@sW05R;J{gMFjduIVq|D;$e^pTq*-t<=Jr9}sKqk$bf;p}FHEJSh$xMYE2)oV z;|G4?hpmfS>o07%KkH!poFDq;yo2eP+9z^NRstEeDs>a{z}e&EnyYG$Ja^UnP+jeI z8Y;dn8v$2JHSNmahKzkXA1vlf+h-V+A4Z5ga+bOUeT0OA{UfL?SZ-5k{H~0o>zkf~ zJuPMCbr9%vvcIWgk5pctc?=i3UsvYr@xIG0(^Q#@W7(_ui6NuB+l^xyIC$;}2&|Cr zAe&g*9COXr^kYExKb*8)w3WD#EY3Zejq_wSRX5UIU6fIpbc)fzWZiFt(sW}M=JJn< z_%Xho*Kun$RHmV1n9SC7H+EG`t*Kxx47HKQrz{=p8zQ>2rsCN5lr3sU`k}4g2SfYA z+LCdLr}vK7cCf=!P1z01^;8&Hs@g%JPhj4+0zC8>dCyu274a;dWA%UBhvDGV4?1YQ z-7Mk|4j1u0R*E=|6O1d>^25TimbZ%d3C=kO8ANJL!(8~jZ~Z%Kdo3S*2%tgHp;v1xJ;e$i#eh~C&^mJDk%ZGzl zxPhjZMCfKSJ;0iMAp{EPvS}!KM<8t`P}Irkzf5 zo3zs)BEnl_mT5gKk34jV!~;KKQDY@MwdMyRR$hAA#+0nm4gIAR&;c{s(QbR#*}9T( z>cg@dMQb~n+9RCHBHh#sb)bb&05>&r)s1W&uCmZ8I$jl3Uf*^>ie@)l?FqI<8Hu(w zYM?8l^{VLfSQr^oB2=uc$JQz}s(Ss5b-IZWZOIxY%tOT3nS9BKQjx8GM8WheLn|ub zvC&bLHX-ZMaKU0*T_^o4#2(k?V->n>QEkgkBwL}HWjWncX?<61$rMw4iD6Znsd{Xg zQn~cqG)R^%64~M56(!r{2ZBn!B5O~PQW}!@dGG>jz%9aq%A;9C%idwaa>;4v-(~Rwx2S#1QDdf2Nv?~MN#nZ#RcB%1+a@ip*06$3HzkCj^90zBf zDn|cGyUYgWoi&-wdXihetcg)`k1fXZX*no8uhU*f;nToGo#l;d}3ilbdi(+(%|*cVQE` zdl>r*moo$eb`li$HOBB8l<->|8G!VH7T5TD(LR)XmNqL(qgZ=d)MV<$H-eiy~TF#qj+Oss5T zaxr`UFxLv-k9&W_srx9d*xBJtOud$ph?_zg3T^s-Sl@08=`Kzq+=l}gP#VK!a z?^}AvrP(-!Nsj-3efXRy{en!s#2I{rpW`kTIj`eucByaDNKTX48RqIF$~^rnUc)K! zw>i1J9o=ora+kdxZ=-^j7~RXD z!S^J7iZ?kH9DDR*Jsm9Vsoh6*rL<=grNzHuZ+W-3fqfg8eo)~O*#Uo|{dbtcJ#yR_ os>DH@#X0V0aR5I{t2{-k^Q?S^e{XRo!{`t2U7+s_?e=5h|Nh-|u>b%7 literal 0 HcmV?d00001 diff --git a/build/classes/random/text/generator/Gui$1.class b/build/classes/random/text/generator/Gui$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2cb0a3ed2820e055fe1602e80f9ec47ed679dde0 GIT binary patch literal 515 zcmZ`$O;5r=5Pe$;Eww75qDZ`P01sA-#skI+QDagy5rZ+F7TCa&vQ4(F@o#w|(ZnC% zk1|eyh!+mKZ)V=kn~(ke`S=2Gf{KGIwk&KrFj6d8*s-w7kUN)3#up5kTD`+yw!*$( zSoft8cgeUb^ds*E6e;>)j|UyDW$Mp^W;~P;gL|Wt(5-++ksx>9*If0(u@{TC*c%Aq zcpPf)I+4{zlPc*%F*xlo(LHe`Q+1oT!x4YwRQgi&f-sV5a4X_r*mqIJo(l^$LwTt% zLuDyfZ7>v4aWCL%;N5peq8HOdi_k-&)ND+1%q2Bfs=fFNx*cn3r&;gd2qx{3wnj@e z=ulVW<;n608DaKd0`@+o9lCSV;4xOnc4rR=*T|zu|B}y0EKSaT!g!t_^Ry61|114K e8>jz7@^g_43d9=NK#|ZSYZI$vIV5Ki0`@PX?PntZ literal 0 HcmV?d00001 diff --git a/build/classes/random/text/generator/Gui.class b/build/classes/random/text/generator/Gui.class new file mode 100644 index 0000000000000000000000000000000000000000..60e263c73494dc3f87e8a78cb7c1dfee1548b20b GIT binary patch literal 2089 zcmZ`)TUQfT6#fPhCJduOR4}L*>ZK8asl8XM7J^V{L<tP9_NUqVGPn zZ+&PV`qIAkC2^It`UCoV`rOrT&wvCk$y(>kzVGwxefIh1zrX$l@GhPhIFG!645oBk zOJLeSCuU^%RL86V9eEvd2Daz-UlWudBL-uFJM-2Uj$7X3j5Zh~>Si(r~C?yK25sD=WWfl^t@D1+QW`OO|g7y~B(J z4{Z84Uhplq>eX_A+6;0livF#@^K&x|dz>yMfQI<8Z`J7NNMY65ur_n`hqk+to0}Fc zwc_iRtDKj_H-#%=$11-8* zBg+aAMvI(oy?3Tj|{bRnq|>xM1QT2;kxN^UduR?!XQ}D%3Tx zDcEk|k%@2d9h>sCJ$dG$j_*zUfX5nAuhr7fD`BI$-zcxD3Sl{#d37@!tE*s2En5vI z$U9zL-B_0^K$O`>nOSL^~ogS_VkY%b-GhoWv8McZ_`JrUQK}uiNzbn;f7+_>er{>#tMFz7>RN3**os6Nh8cum z_Fao|XqJmqW^m3U9C-p+%WX zw*uR-16u}UkL_-FYpOt){5{9vG+1c3u1rJ1jA1?j=Q**#!K=wV=Q>7eoV&)od!z+z zq=}9{Np#=>*Mn3AdJ#h(5*+k7Qf8!#w{Ve^CbNPo9ce|x(M8@L+vqGMV=crBqg_pO zZ9^}$khq@RMt3PozR^Sv3A5DKai>rFw}k^u9L)9_(f=6^HPJhoZKCh?Hj<^};TDd} zk0tw?7|4z_ag5wlDUoPl@KP)lOCE3H1UHILW>c|9K2%DcY9W0oo{EcLIGc)#V6=%h zMztnRk5cc<-Z__WlzI2_F&n@kK3fAA#2FmNdpLn9oWvYXp@=l@62$vBjWtSrzFS*3 zhbM&fDS`b7BlwwE{6Z{#BYM9REy3$bgvkzG27bjme3e-z{7C=r6X_!VAK*h`y@rqR z5iSw$r;Iv|%S5!ByekpHly&e6=-I|uLVE5Q-rPHcK_OTUgU wordmap; + + /*Head node of circular doubly linked-list. Nodes are arranged in LRU + order, i.e most recently accessed node is moved to the head of the list. + */ + private LRUCacheNode head; + int size; //Number of elements stored in the cache. + int capacity; //Maximum number of elements that can be stored in the cache. + + static class LRUCacheNode{ //Implementation of a node of the linked list + private WordSet wordset; + private ArrayList followingwords; + LRUCacheNode prev; + LRUCacheNode next; + LRUCacheNode(WordSet wordset, ArrayList followingwords){ + this.wordset = wordset; + this.followingwords = new ArrayList<>(followingwords); + } + WordSet getWordSet(){ + return wordset; + } + ArrayList getFollowingWords(){ + //Retrieve the list of words stored at this node. + return followingwords; + } + } + + LRUCache(int capacity){ + wordmap = new HashMap<>(capacity); + this.capacity = capacity; + this.size = 0; + } + + private void appendNodeToListHead(LRUCacheNode tempnode){ + tempnode.next = head; + tempnode.prev = head.prev; + head.prev.next = tempnode; + head.prev = tempnode; + head = tempnode; + } + + private boolean isFull(){ + return size == capacity; + } + + private void deleteLRUNode(){ + LRUCacheNode tailnode = head.prev; + head = tailnode.next; + tailnode.prev.next = tailnode.next; + tailnode.next.prev = tailnode.prev; + WordSet wordset = tailnode.getWordSet(); + wordmap.remove(wordset); + size--; + } + + public boolean containsKey(WordSet wordset){ + return wordmap.containsKey(wordset); + } + + public void addWordSet(WordSet wordset, ArrayList followingwords){ + if(wordmap.containsKey(wordset)) return; + LRUCacheNode tempnode = new LRUCacheNode(wordset, followingwords); + if(head == null){ + head = tempnode; + head.prev = head; + head.next = head; + } + else{ + if(isFull()){ + //Remove least recently used element from the cache. + deleteLRUNode(); + } + appendNodeToListHead(tempnode); + } + wordmap.put(wordset, tempnode); + size++; + } + + public ArrayList getFollowingWords(WordSet wordset){ + if(!this.containsKey(wordset)) return null; + LRUCacheNode tempnode = wordmap.get(wordset); + //Move node to list head + tempnode.prev.next = tempnode.next; + tempnode.next.prev = tempnode.prev; + appendNodeToListHead(tempnode); + return tempnode.getFollowingWords(); + } + + public void printCacheContents(){ //For testing purposes + System.out.println("\n-----------Cache Contents------------"); + System.out.println("Cache size: " + size + "\n"); + LRUCacheNode curr = head; + if(head == null)System.out.println("Empty"); + else{ + System.out.println(curr.getWordSet() + ", " + curr.getFollowingWords()); + curr = curr.next; + while(curr!=head){ + System.out.println(curr.getWordSet() + ", " + curr.getFollowingWords()); + curr = curr.next; + } + } + System.out.println("-------------------------------------"); + } + } + + public CacheUtilisingGenerator(String text){ + super(text); + cache = new LRUCache(DEFAULT_CACHE_SIZE); + } + + public CacheUtilisingGenerator(String text, int cachecapacity){ + super(text); + cache = new LRUCache(cachecapacity); + } + + @Override + public ArrayList getFollowingWords(WordSet set) { + if(cache.containsKey(set)) return cache.getFollowingWords(set); + //Scanning the text + ArrayList list = new ArrayList<>(); + for (int i = 0; i < text.length - SETSIZE; i++) { + WordSet currSet = new WordSet(text, i); + if (currSet.equals(set)) + list.add(text[i + SETSIZE]); + } + cache.addWordSet(set, list); + + //Uncomment to view cache contents after each query + //cache.printCacheContents(); + + return list; + } + + public static void main(String args[]){ + final String defaultText = "She is into superstitions, black cats and voodoo dolls. " + + "I feel a premonition that girl is gonna make me fall. " + + "She is into new sensations, new kicks in the candle light. " + + "She has got a new addiction for every day and night. " + + "She will make you take your clothes off and go dancing in the rain. " + + "She will make you live her crazy life but she will take away your pain like a bullet to your brain. " + + "Come On! Upside, inside out she is livin la vida loca. " + + "She will push and pull you down, livin la vida loca. " + + "Her lips are devil red and her skin is the color mocha. " + + "She will wear you out livin la vida loca. Come On! Livin la vida loca, Come on! " + + "She is livin la vida loca. Woke up in New York City in a funky cheap hotel. " + + "She took my heart and she took my money. She must have slipped me a sleeping pill. " + + "She never drinks the water and makes you order French Champagne. " + + "Once you have had a taste of her you will never be the same. " + + "Yeah, she will make you go insane."; + + CacheUtilisingGenerator gen = new CacheUtilisingGenerator(defaultText); + System.out.println(gen.generateText(100)); + } + +}