From 1ae96e20c07162e6019af6116610fe7ddb8defd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20L=C3=A1ska?= <krakonos@krakonos.org> Date: Mon, 20 Apr 2015 22:26:27 +0200 Subject: [PATCH] aim-life: zivy klon aim-kitu --- aim-life/Makefile | 32 +++++++++ aim-life/README | 1 + aim-life/aim-dbg | Bin 0 -> 87936 bytes aim-life/aim-opt | Bin 0 -> 13296 bytes aim-life/aim-run.c | 125 +++++++++++++++++++++++++++++++++ aim-life/aim.h | 48 +++++++++++++ aim-life/exercise.c | 58 +++++++++++++++ aim-life/statistics.awk | 29 ++++++++ aim-life/worlds/Makefile | 11 +++ aim-life/worlds/meth.rle | 4 ++ aim-life/worlds/pbm-compose.pl | 125 +++++++++++++++++++++++++++++++++ aim-life/worlds/rle2pbm.pl | 46 ++++++++++++ aim-sort/random.c | 17 ----- 13 files changed, 479 insertions(+), 17 deletions(-) create mode 100644 aim-life/Makefile create mode 100644 aim-life/README create mode 100755 aim-life/aim-dbg create mode 100755 aim-life/aim-opt create mode 100644 aim-life/aim-run.c create mode 100644 aim-life/aim.h create mode 100644 aim-life/exercise.c create mode 100644 aim-life/statistics.awk create mode 100644 aim-life/worlds/Makefile create mode 100644 aim-life/worlds/meth.rle create mode 100755 aim-life/worlds/pbm-compose.pl create mode 100755 aim-life/worlds/rle2pbm.pl delete mode 100644 aim-sort/random.c diff --git a/aim-life/Makefile b/aim-life/Makefile new file mode 100644 index 0000000..ff03dd8 --- /dev/null +++ b/aim-life/Makefile @@ -0,0 +1,32 @@ +# Compilation settings: +CFLAGS=-Wall -Wextra -std=gnu99 -I/usr/include/netpbm $(MYCFLAGS) -pthread +LDFLAGS=-lm -lnetpbm $(MYLDFLAGS) + +OPTCFLAGS=$(CFLAGS) -O3 -march=native -DNDEBUG +DBGCFLAGS=$(CFLAGS) -ggdb3 + +###### + + +.PHONY: all clean asm +all: aim-opt aim-dbg + + +aim-opt: aim-run.c exercise.c + $(CC) $(OPTCFLAGS) -o $@ $^ $(LDFLAGS) + +aim-dbg: aim-run.c exercise.c + $(CC) $(DBGCFLAGS) -o $@ $^ $(LDFLAGS) + + +exercise-opt.s: exercise.c + $(CC) $(OPTCFLAGS) -fverbose-asm -S $< -o $@ + +exercise-dbg.s: exercise.c + $(CC) $(DBGCFLAGS) -fverbose-asm -S $< -o $@ + +asm: exercise-dbg.s exercise-opt.s + + +clean: + rm -f *.o *.s aim-opt aim-dbg output.pbm diff --git a/aim-life/README b/aim-life/README new file mode 100644 index 0000000..bf835d5 --- /dev/null +++ b/aim-life/README @@ -0,0 +1 @@ +If you need test data, take a look into the 'worlds' directory. diff --git a/aim-life/aim-dbg b/aim-life/aim-dbg new file mode 100755 index 0000000000000000000000000000000000000000..69d279d5be4712090ab343a4c111a5bfd710bf97 GIT binary patch literal 87936 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%0APtNgKta;XSODrfwJ}D40<M$M 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 XBb2c42ARyj(1<1p5rryZU|;|M8wE17 literal 0 HcmV?d00001 diff --git a/aim-life/aim-opt b/aim-life/aim-opt new file mode 100755 index 0000000000000000000000000000000000000000..abd0c02201ff20961227462c3d4c2b3065701f96 GIT binary patch literal 13296 zcmb<-^>JfjWMqH=CI&kO5O0E@16T+`GB9k=0dv8G1A_$v7lQ+XEQ1sS8v_FaD+2=q zOq~Oi1)~j^z*-n!GzWysz|6qFz{0@5Pym%LV1k$cqh+A#U^K{0AR!P9vJb?DV2D1L z3#LdyL}4@og92Cpqz~lQ2eM!;!vom_Fat)vfV#r~<S?)dL?1{Pr0)k*-w&uh7|j4u z08$U7Vg3X84TO83;yqCR!Dxu-FxNrC0%T0U(~=aBJ_m6SkAcBK9O6G19Rd+%fYBhe zAfdpgB`F|xg4o1h0jQ!NsC~G?MFHx57!3+Xkk$rKmQ)4}5Q{hr3m5&I%p@}t{hSot zoXot^3f&3|GhH(iz2ba5BXD{ExeH{6yI&~SV3747f5E~F6g?6Q4B#{h67M*uz{tQF zzzq_UW?*2DV_;y=knNFia=rRy_v1-5Hwq(UcJzMav;5R8^ZN38KCq!!h<Zi_1|cls z+zf~~LYDT%p<V!o_%8<R<|p7#uYp567l*hy4tFZzQ1606d>;;X2H{XY9f$fCIK-K8 zn8S%f+zf}m8gQ8Z6^FP!4)eWmn7;ytIkt=p41x?23=b3_<p(TXw=gm=2r!5<oPdhM z(#mwOxCDcMB1An*yc;TxuD%3pFBd}u7bM@q)JH<?Wq_Ikv$qPYo|hp-3{^ctPG(Xr zC|j8^#CwML#;2qfrKV>Vm!uYj_&Vq0=cR@uCgr3u#K))S=I6y1mn0UI#K$wldzHlp zLDf0uBo-H^7DKdS)tr-=l$Tmk0I|o=kRd)ZFSCRpJ}omZlc69fH@>_mvm~`3DYq!U zJiZ_?IXg84MHs9aq^>A6F$Gf@R1~Z#Co`#_Bm*P@@{$3_bIBl<8AE)0K~ZL2Nm_hz zMm9rg1;~C+|M-H^l4ORo{DRaxhJw_hqWmI;c#t2Hvq8$@(-Jdt7>Y}ZO7e3Ua#M4Q zQ%e})<I|ALDK1ILFD(JdB^OjOq$TI%7pF4hCg$YiCo>e6q@)%VF{G!Klw{_n=BK43 zRx-rL=VT@&gKQ`&iO)^U%wtF^N=;>mPfbZINo0tRPbw~kNHWBy=A|&W`*=Dz#~bMx z>zTmWh6pBtWu#{cihocU$i%?RzyyU13{2p%5+u$F7K5mQ)Qe0Ej8F(+u`t|Y0HsZk z8U}_E$xKdAjXejP{umghOq|9Bs(n^K`68K_ybKJ?44a|+QYnynCWgJBLYaYq;fFjV z9fQhVPKc3U5|$r8ZUB|VU_lT8O|KwvXcY<)Wsrd86Lx4>4i*IEMI>=hSq~G}KoW=5 zc_29hByo@(ATbcOKoSSJ6(k124oKo4yFp?g?13Z>%UdAv03>l_|3)B*bAc2>aRQP! zsP2FYGh`r%^S}f_?H?p@UL^4fByr?Qs{u)zA4z=&k~pXig-K075*LICGB7aAKoS>5 z5?_EME`lV!0!dsHNqhs6IJC(Emi1_U!{O1*I#pDG!K3v+3G0i=3=9k&%||#6gQelb zf72#W1&05sEusnx{PGSA|5ZW!43PZG2mk;7|F2pls=$x|N_{UcfcZrrJ}BwGJOJir zf%u@L@^S;1p9JEAlE}*iV15*c4@w#@CxH1uAU-HbylepTy+C|WQg~Sa<~xD-pd|1z z0nE1o@j+4lG62js0`Wmn{?Y-=*8=fDQT@^Y%vS>OK~elt0nC>I@j+4hQUJ^s0`Wmn z`jP?6=K}FTQTg)2KahW!KzvXXzI*`Y{}NGP$N)v%%L`!sClDXhRC##-%zp*qgQD=| zhJXM6g8~j2JBB-kIfgohga&&wzUg3KU`X-kW>Ez-+&ns6R4NP)H2-Jy=qyoDC~@=X z=JV*beJ!HEu&YDNfngsg%nc8`==%Tv{|*q_quWQNBE`d)2dtgHRg{&1!K3jA$k6Cm z#~8<0$2iCM!yer(Dhm4!h&eELbXQ2c;Q9amzeno<kYybFEx%b97(BXbR5(0(eN+-W zdP7uVJbFu1B3>;0_y503caBO#caBQTevt29Ec*BVzh~z$kWLHN-dc8-P7TL{@0mL@ zSX?@PyL8s5h`1X5=U;!<qx1fYGO*eszMW|tu7=-Q-<J4!bjGMixO9GY?fmD`U85qB z#xLIj4wp1A(1UTiLGA##sPmo=<1?4eSC0RWxiJ2IvE<+X|BjaLO7DAg$EZkv-Tb29 z@BjZk-8Cu-hTnF95`brSJ;#gFfB*mY?5-E^>^ue)2D#Xv(?vz(#rnVh|ATlQp2^2N z4nAP^=sXVMI=ndc_y2#_)^8w=27jMB6DU+%R1BJbaPaqSV+QejR5Y4jaJm})Klp;V zm*prZJ^J((YIM4QeDyO8?tXAsb^54qIP&xIy~qPwc;B=0xJ#!-X9kOB^D&1Pkzm1F zKAq1zJKZ@vI*-3l|NH;HZ)e>Mu;v$*V0nb57aCvzWDVc`fHf?DXy5?LBWd{l2jov= z4M!mwRzNgd2g@UAI0hC#)-VO4VFN_NGO#?7hN)lyWDUs>4LcwjO2P6-8dAUl$Qq0w z8V*1-xPax6G#G;gkTozuG@O8F5C+R5X<z~i+yaHEPv<jGuwMB6|9`iS3WslJ-G%0Z z9M(Q668x>vpoG+U9+Y`BJd=<6bf&0qxOV<=?R@Xp`PQSC=b%UDS$=s2uqBTFk9ag6 z<#@6DHz+*syL4K(fFiN;*o&zkk?s-|4$n?E4v)@TAnOu;|NrmPS^C4pGDStCexFZw ziVBC}H;>*Lm4p{xfBpaOkr|_s;NZm1;K3ZDk^xKb;N*`;KQIkPKpMJTR1!Qg4?y&| zsAPC(-te%MU&zi-cLSzw4oF>Q4$R;jm5k;Z6$6Gkt!@_;1F$E%V^lo;pYZHF=hK^W zki)0*d*?mR=3^W$CNVQG_*%XzeG4-x@YnzUY5d^__MHF~7MU&(Gxvjw8fLKVFF+ZD z16=rg^5EBUQQ`Q+AIGZ5#=!7m3CJDYE-D%zJ013&6LVnj>CWN!0WN+#x+@f3OaiF@ zl{|+_iXFQ{Ssc4d84OQ)bRIW+`y%Yu|NoB7wJZ!JTKw{$t^|W)cPLo)es2-`!FSC3 z>%V$3mva0+`XU>o)H;`?2wc$Q{se{j^B18%|NjRS3KlQCfBye(c;MyzU;qER8vcJN z^6&ru7vVqu|KER6%z@#B?63d-!9IFn3}PJyiE)BhAYZ<a2ZaDUEAz{{FfbUt_3XSD z=h6Adqxs2)fDq5)2NFP`bNt{3Q3nQ(<HsLxJ21R3|M~y_mo%{Y9p@Di7(zXCLH!7i z<{x|>olnc8cYsPdP_-)<yB{R+{{g)Ci#-fZ0B}q9f#gFy8sC9vkAwf1JvyIybbjzS z_`=?U@tDWOe<h-D)3{-#@yj#B9){T8V0(~Hfq|h^Fw~>->5IJo|NqAxV_nCmz`*$V zFsMG?|3Nl^!K2xpp_KLYWPW)DxM3eb8vb91eOdMY|9?b!L}G#c*UfJDtv7)E;45bS z_2DcY-Sr$VHGhE84YW81)oq@ge?x;o4UTU4?tB(-PI{5@15|q)>6B<b%-)&7a_}`X zw5sq1NpzP&Gm&SfiwegJ@gM*HgW4w1KAjK1H5tfrkm>?%zTsQ24el(h2l!j&GcYhf z{O{Q9%FueCq@eS)tKk!nhrz*%@P(u05tq(K`}G(Y7>W%XEn`{Aw3-iqyyMdO@ZbyP z?-%*kA8vlg&UnGIJCuWe8w=CrAI%RK`S<O30E+f*QyX3d2G9RTUWk1E{~we_eJme& zbY3W5;n8iX$g9AxA5;%{{6G5Q%Quj`D~pHa3;y<WP^H^#%D}4tZgPPYL8|DNXTJUa zpO%K?K6v|}^Rq|u8x5as^Ue|#8K2JYFBbm$|G)LNXXnx5E-K(Ay>I6m{+1<-3=EFl zcCG*UTR>wMuHAVo9>-l&Kou0Y0f**)*VecEElP}_D$PZO1Kg%?HN4$<*s=5A_Y2Jr z*blyD?mP&pEH6Ln{MuQfBJlkx$OL%$bm<Lecj>&hgGJnd!SUcLW>>=lDDvGNf4T)+ z7*8^Oviw=B>u7nkOv90X{UyiF^WQImnhVVj*<Bca`F7WFIPz~35x@Ma`4MBoFGkPi z8~;6;4{&(cx`;b4l<xFw{=r;g>e>8*iNAFv0|SGj<yZc;1z^Tc{$|i1hYSDuYo6V1 z9H7R8BjYV6{%tG*{EL4S*Ex2xsDPsM1vCHpV~jUEnO#&k927J_!u;E6R0J^OI4m5y z-B>*TA9n1v^Rc|)*?E+|T@(~!|6No#I)8u~92_2&H~8DZ?K>A037^gnzMaoN?GWo2 z6`2xM&(0$+EC2of4@zzzYhX5fV7%waTmrIP@AVvy<|7)AI0rY&V8uVUJ=pmll&pPv zRqwGYFob&a>VoKC&(3e2omUNS`)ED|C3TO3f0<vHegQS#-j>M0^!s$a^6C8M()r)< zzsMbr=EIC0maj`+fin*{=YTCkN?)H3gPQ$sI6x}Un*N|dih&V2fT~)o;2Gi?<QU@V z?-#7#?&=3;2M0NO`Z~J1>J=pAD!2rPz&W6#&rp=akdvR7!l0^WoW{jap2Sd`Se6Pl znSr69MbA;M0?NTbftuhT43Y-XpmG^TgTz355Qec~av&NkCe3UO8jA&W5F9@L{|`zt z3%>mSFTu#b5b*2&{{jXEhJ@e$|DRxBU}*UL|NjF928IW}|NjT|Xb$}O|9=4^0|Tht z{(+H!0n}fx0QGDb7#LuEFUG1M2F3~jMrj^)jtPwH0w8hFnD~vK|Nm=&900{2aS#(# zJp+RZ0|Ns{{ftll{|A6P!YAOyC*j4<UCz<KU@v8@WvrqE(g)J-!oa{V;n)BF$o)7I z1_p*0P=E2)|Nr42g-(0|y-ZGg5<Sc=d<tzWj(i%;tS)>8Ob&b+j(iF(d=gH40#1A! zJ`4;DQ$T+H{Qv(#Q18o$PoN*9uaDV@PobB^iBF@4)sfGjjm?qIqM6;D?*JoHC>NiF zBcFjIpN12kf)mUnM^N920pyM+p#Ji&|NpPxa)%qA0n=7K4L3doN0@GqJ7gFc7$koG z|NjEyfBf!n<4a&Z%ZSYxAUhct7(ii^!^ps}<In&9;B<yC&y^46FAtEvJV5^P=W{5) zY8oiKw=gm=JoxkfKQzjrHjGlEAut*Oqai?@5J(V$%nLX`X_%>?q7cMJr&B<JNMo|+ z(D<OSWRMVOfD1&!<|#k}Tp&Jd9s)WI3!i5N&CP-2!R<r_1_mh*hk=3N1#~_YR7Zh? zVDex8{m%#SH$dl2K~)Hde}fg`AJ70Ei2ng94{i)FFfg2idI(%;FfcHH8?Fot49H`a zAbp?#LlDgX9lwN?!4IJNLFF?@9yBlrqG5Gn1qZ}_n79Fy4|BH%NHGHg1E@U!V#4hI z_aEY)2ka32|Dk-SbqpV%{6$cCkY0LV_&he6Wz(SZPs^b6HYj}zN?(K0&!F@-D9y$V z@t+u!R)f-JP}&Vjhe7EyC|w4n+o1F`D7_3yZ-dgupfs9u8Qh(ntrRreQ}asl^A$|= zEcJ{O3JmoObQB6QQ*{mW%=C;jA;LIR8e>t(pjTX(TauW>pa+^P0@E2VR%TvFYEc1$ zUS57ls-B~hr*27NI)h$%Ua4M2VsQq8UP@(Nab+%qE-8Y@l%*CGXXfXjaN>&?^omk* z5<wcEtb&{p20ie!mtIL~MG1o*ctTCDC?7nVq?eizpH`HZn;M^yQp5n~L3G3?78NB{ zLUh2`S;<9UXC&rkCNt=z=a+y9J+Lhh6O)RI8T69#b8}PkK+})tL5sm>W?*E1t<yl3 z1kF&v);FMvGc&;QF{(HV11$fdinB7n@;RzF8w0ld!OXzU0LxdX>Nyx-`4d%~lL3~G zQN=OmT|x594BQM2(DV)B!!R=g4+CgC2F8cc%nVrOV;MlRYJ3b0=<~E-aenwZ511Js znwdd>VFq;l2Z#^D%nX9?aup^9qL~?l;N>ZZ55vq1!VI8c7#JT$Gc$-VV9Wo^45AFM zc|Mq05Y5aW#sDiXL3|iyW)NrC0WC*iVj!9sX`UR!hhb(0SnU84fvo3XVfctKe*r4T zv5AX;>nJ`3259&|N*x9U&>SN+^&p$DiGyZBKr{NVdI+Qrge}45V}_3tND@o<gI23B zVhNvY@ccXv185Wvq!m`rRD;DqBB;0*GzW?*1m=MTC9thK*b7#V8UCRDCbsnm=W*Ek z7%a}ipdbthNpK&Ffq~&QSR6Awe*}wzorXg2;#g;)j6)o>o<fL$hv5LUeFE-dGB7ZB z;!q!pL%aq&UyT_KouGa-iVGo}892;Y16pUnB+hUEEj{l9tLI^05P^gbxG%}Tz;FmG z4lxs%yb3ah0g>N96OthLCpgr90gLl6fQETN>cD+V&>A@=?CXXkm_T#-nCnVp!RmP! zVC(l_V+1N-agfQV*c56GX!sXd#u2O@QNDru@C*zLZeVd_l@N9U4)J0f;_Xb>*Hz8N zp?(t%@gqzO41!FU>uxUKQ2!c-y{ydG!&w?E&cm<(nm%FeKy|P<W__W{3@S||7|_@0 zFeGN?>K2ve=_NCyR-_gsXBMaGB{L)z<(KBAFr?<B>4GYJy<~=X@FE&W-3?wW67Le} z=jiL{j4A_Ou)`4V?&I&|=o9bn<`(Q45+CB|<l`C-TaA)jTnbr=lU9_P>fqoGU33Ck zQ-W_r5M=EOs(Mf}0lt6*#DT7fK~t4kT#y4=4Fhhkpf9*Vs5N1Thc3}Uh=E*%yrc$I zCNnoNJvBZVv}_5qD5p5J1XUhm{SCS_$jvYhpssiVwdeA4Fw__4$7dwwrR1c-V+&+) zazQ0Rr6I&0#U&}3dGV#i(8W!lHA)3ZxuDoYjtDRxvVsU<0?5;lIEF+gXe|_M%@kMz z^2#CbvLfWwP6%^A>xjUMoe)AGqaiDwP{pt<@Itm0X{i=yF%_ET_z+*`cvn9c&`L4n z1ycxRAg6#+7uE%1Ae*28gk%vcc2g6Jpi9UgYpf8af_wuhW+)~>{ZLS!3sw)q+Oe>8 z$gqAW%p#Cl7#l<@GcYiK`hGC|u=Xx&oiA*iDo8B|!^(XS8-xuR7#P0&|DO-j4{H~1 zfC@lr7to3<kZJ}7Sicg&V_>jmU|;~XiJ;2i?dK0r0oXcbP=6WZc9?!xKhzoA-UO{6 zgO~_wXWsy6K<Yn3WFhS`7#l=;GcYiK`mRvx;O+56pg>_@V6X!z0@Yhk8m10LM=&rj zfcnBPKCIpT0IEL#st@EGWcNdb8PcI<!}P=2_Xbdp!usE^aEA)R#{mkV`XTK&26#W9 z0;&+!{|D&@g)>wbt{>EH1Gx(}{s0^Qh=2}2z{WLT?gg0xV}s~2aJ!NLylx)EhxIEO zp!&gM^dJc+1}%jFF=2EgntoXS;{nLA3=9lSP;)?fKo~tewxj8Xjn|}r8q`SR79hPK zjP8C=`xNAVSop*GGYwGv2SA#TFf2X8gr-96hv|o{Ylp3O2hF9x)PiVq`xm3>hxLzU zKr7}yAjg3;LNP4<pj?Kv3=9l>&^!PVgRTFEt$#;XkIvu8z`y`ntOXlCg7q6-fI1!w znE4f5|52#>VftbHvJXV+Kg9q^J23sQ{u^w60(3eJye9+XKbZZn^m7@_epo;6hdf9% zZui5?xq+r1-XDY}H1PaB#3(Qc(+8s;qUneA8+SnU!`unhj3qpuL&aeJhpjt30o88+ z(+H)Z!cZOq!yBmm=;~nl(bFF+Il*YqLOht=a6>_JY>E&bX#F{a1tDSjAUsHU3QPMi rF%T^Qo`qvz2!NJ@pn3>Y*TBLJR(^xV6|vc$p$RgDfx!_?65W0PDjON4 literal 0 HcmV?d00001 diff --git a/aim-life/aim-run.c b/aim-life/aim-run.c new file mode 100644 index 0000000..61bba6c --- /dev/null +++ b/aim-life/aim-run.c @@ -0,0 +1,125 @@ +#include <limits.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/time.h> +#include <pbm.h> +#include <string.h> + +#include "aim.h" + + +#if CHAR_BIT != 8 +#error char size larger than 8 is not supported +#endif + + +static struct image * +image_init(int cols, int rows) +{ + struct image *img = malloc(sizeof(*img)); + img->cols = cols, img->rows = rows; + img->bitmap = malloc(img->rows * image_rowbytes(img)); + return img; +} + +static struct image * +image_load(char *filename) +{ + FILE *f = fopen(filename, "rb"); + if (!f) { perror("load"); exit(EXIT_FAILURE); } + + int cols, rows, fmt; + pbm_readpbminit(f, &cols, &rows, &fmt); + struct image *img = image_init(cols, rows); + + for (unsigned int i = 0; i < img->rows; i++) + pbm_readpbmrow_packed(f, img->bitmap + i * image_rowbytes(img), + img->cols, fmt); + + fclose(f); + return img; +} + +void +image_clear(struct image *image) { + memset(image->bitmap, 0, image->rows * image_rowbytes(image)); +} + +struct image * +image_clone(struct image *image) { + struct image *clone = image_init(image->cols, image->rows); + memcpy(clone->bitmap, image->bitmap, image->rows * image_rowbytes(image)); + return clone; +} + +static void +image_save(char *filename, struct image *img) +{ + FILE *f = fopen(filename, "wb"); + if (!f) { perror("save"); exit(EXIT_FAILURE); } + + pbm_writepbminit(f, img->cols, img->rows, 0); + for (unsigned int i = 0; i < img->rows; i++) + pbm_writepbmrow_packed(f, img->bitmap + i * image_rowbytes(img), + img->cols, 0); + + fclose(f); +} + +static void +image_free(struct image *img) +{ + free(img->bitmap); + free(img); +} + + +typedef int_fast64_t timestamp_t; + +static timestamp_t +get_timer(void) +{ + struct timeval t; + gettimeofday(&t, NULL); + return 1000000*t.tv_sec + t.tv_usec; +} + + +int +main(int argc, char *argv[]) +{ + if (argc != 5) { + fprintf(stderr, "%s ITERATIONS GENERATIONS SRCIMAGE.pbm DSTIMAGE.pbm\n", argv[0]); + return EXIT_FAILURE; + } + + struct image *img_in = image_load(argv[3]); + + int iters = atoi(argv[1]); + int gens = atoi(argv[2]); + + /* Copy the image for iterations */ + struct image **clones = malloc(sizeof(struct image*)*iters); + for (int i = 0; i < iters; i++) + clones[i] = image_clone(img_in); + + timestamp_t t0 = get_timer(); + + /* Pre-warm the CPU! Neccessary for benchmarking w/ dynamic + * cpufreq policy. */ + while (get_timer() - t0 < 500000); + + + t0 = get_timer(); + for (int j = 0; j < iters; j++) { + exercise(&clones[j], gens); + } + + t0 = get_timer() - t0; + // time spent: + printf("%.3f\n", (double) t0/1e6); + image_save(argv[4], clones[iters-1]); + image_free(img_in); + return EXIT_SUCCESS; +} diff --git a/aim-life/aim.h b/aim-life/aim.h new file mode 100644 index 0000000..f1bdc62 --- /dev/null +++ b/aim-life/aim.h @@ -0,0 +1,48 @@ +#ifndef AIM__AIM_H +#define AIM__AIM_H + +#include <stdbool.h> + +struct image { + unsigned int cols, rows; + /* Black-white image, one _BIT_ per pixel. Rows-oriented, + * rows are rounded to whole bytes. */ + unsigned char *bitmap; +}; + +static unsigned int image_rowbytes(struct image *img); +static bool image_getpixel(struct image *img, unsigned int x, unsigned int y); +static void image_putpixel(struct image *img, unsigned int x, unsigned int y, bool pixel); + +void exercise(struct image ** life, unsigned int gens); + + +/** Implementation: */ + +static inline unsigned int +image_rowbytes(struct image *img) +{ + return (img->cols + 7) / 8; +} + +static inline bool +image_getpixel(struct image *img, unsigned int x, unsigned int y) +{ + if ((x >= img->cols) || y >= img->rows) return 0; + return (img->bitmap[image_rowbytes(img) * y + x / 8] >> (7 - x % 8)) & 1; +} + +static inline void +image_putpixel(struct image *img, unsigned int x, unsigned int y, bool pixel) +{ + (img->bitmap[image_rowbytes(img) * y + x / 8] &= ~(1 << (7 - x % 8))); + (img->bitmap[image_rowbytes(img) * y + x / 8] |= pixel << (7 - x % 8)); +} + +struct image * +image_clone(struct image *image); + +void +image_clear(struct image *image); + +#endif diff --git a/aim-life/exercise.c b/aim-life/exercise.c new file mode 100644 index 0000000..1123c48 --- /dev/null +++ b/aim-life/exercise.c @@ -0,0 +1,58 @@ +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include "aim.h" + +struct coord { + int x; + int y; +}; + +static struct coord around[] = { + { -1, -1 }, + { 0, -1 }, + { 1, -1 }, + { 1, 0 }, + { 1, 1 }, + { 0, 1 }, + { -1, 1 }, + { -1, 0 } +}; + +void +display(struct image * life) { + for (size_t j = 0; j < life->rows; j++) { + for (size_t i = 0; i < life->cols; i++) { + putchar(".x"[image_getpixel(life, i, j)]); + } + putchar('\n'); + } + putchar('\n'); +} + +void +exercise(struct image ** life_p, unsigned int gens) { + struct image * life = *life_p; + struct image * tmp = image_clone(life); + //display(life); + for (unsigned int gen = 0; gen < gens; gen++) { + for (size_t i = 0; i < life->cols; i++) { + for (size_t j = 0; j < life->rows; j++) { + size_t sum = 0; + for (size_t k = 0; k < sizeof around / sizeof *around; k ++) + if (image_getpixel(life, i + around[k].x, j + around[k].y)) + sum ++; + if (sum == 3) + image_putpixel(tmp, i, j, 1); + else if (sum == 2 && image_getpixel(life, i, j)) + image_putpixel(tmp, i, j, 1); + else + image_putpixel(tmp, i, j, 0); + } + } + struct image * _t = tmp; tmp = life; life = _t; + //display(life); + } + life_p = &life; +} + diff --git a/aim-life/statistics.awk b/aim-life/statistics.awk new file mode 100644 index 0000000..27719f6 --- /dev/null +++ b/aim-life/statistics.awk @@ -0,0 +1,29 @@ +# We will compute the mean and standard deviation of the numbers on stdin. +# We can interpret the standard deviation [*] like this: +# +# With probability 68%, the actual mean time M is within one S.D. s +# around the measured mean m: M \in (m-s,m+s) +# +# [*] We assume the numbers (time taken) are approximately normally +# distributed around the measured mean. + +BEGIN { + sum = 0 + sqsum = 0 +} + +{ + sum = sum + $1 + sqsum = sqsum + $1*$1 +} + +END { + n = NR + mean = sum / n + # Exercise: This method of variance computation might be + # sub-optimal. Try to find out why and implement a better + # method. + var = (n * sqsum - sum * sum) / (n * (n-1)) + sd = sqrt(var) + print mean, mean - sd, mean + sd, sd +} diff --git a/aim-life/worlds/Makefile b/aim-life/worlds/Makefile new file mode 100644 index 0000000..585bf6b --- /dev/null +++ b/aim-life/worlds/Makefile @@ -0,0 +1,11 @@ + +all: meth.pbm + ./pbm-compose.pl + +clean: + rm meth*pbm + +%.pbm : %.rle + ./rle2pbm.pl $< > $@ + +.PHONY: clean all diff --git a/aim-life/worlds/meth.rle b/aim-life/worlds/meth.rle new file mode 100644 index 0000000..fc13712 --- /dev/null +++ b/aim-life/worlds/meth.rle @@ -0,0 +1,4 @@ +#C 18-cell 40514-generation methuselah +#C based on Richard Wobus' 15-cell marvel +x = 78, y = 54, rule = B3/S23 +77bo$77bo$77bo21$3o20$3bo$3bo$3bo5$20b3o$9b3o10bo$22bo$21bo! diff --git a/aim-life/worlds/pbm-compose.pl b/aim-life/worlds/pbm-compose.pl new file mode 100755 index 0000000..7745f7e --- /dev/null +++ b/aim-life/worlds/pbm-compose.pl @@ -0,0 +1,125 @@ +#!/usr/bin/perl + +use common::sense; +use Data::Dumper; + +############################################ +## This script eats memory for breakfast! ## +############################################ + +#Image size is X = width, Y = height. That is $img->[$y]->[$x]; + +sub image_size { + my ($img) = @_; + return (scalar @{$img->[0]}, scalar @$img); +} + +sub image_print { + my ($img, $fh) = @_; + $fh ||= \*STDOUT; + my ($x, $y) = image_size($img); + print $fh "P1\n$x $y\n"; + for my $line (@$img) { + print $fh join(" ", @$line)."\n"; + } +} + +sub image_init { + my ($x, $y, $prefill) = @_; + $prefill ||= 0; + my @img; + for (my $j = 0; $j < $y; $j++) { + my @line = ($prefill) x $x; + push @img, \@line; + } + return \@img; +} + +sub image_copy { + my ($dst, $src, $offx, $offy) = @_; + my ($sizex, $sizey) = image_size($src); + for (my $x = 0; $x < $sizex; $x++) { + for (my $y = 0; $y < $sizey; $y++) { + $dst->[$offy+$y]->[$offx+$x] = $src->[$y]->[$x]; + } + } +} + +sub image_border { + my ($img, $sizex, $sizey, $fill) = @_; + $sizey ||= $sizex; + $fill ||= 0; + for my $line (@$img) { + for (my $i = 0; $i < $sizex; $i++) { + push @$line, $fill; + unshift @$line, $fill; + } + } + my $lw = scalar @{$img->[0]}; + for (my $i = 0; $i < $sizey; $i++) { + my @l1 = ($fill) x $lw; + my @l2 = ($fill) x $lw; + push @$img, \@l1; + unshift @$img, \@l2; + } +} + +sub image_load { + my ($file) = @_; + open( my $fh, "<", $file) or die "Could not open file '$file'"; + my $format = <$fh>; + chomp $format; + die "Unsupported format $format." unless $format eq "P1"; + my ($x,$y) = split /\s+/, scalar <$fh>; + + my @img = (); + + while (<$fh>) { + my @line = split /\s+/; + die "Image line is not wide enough!" unless ($x == scalar @line); + push @img, \@line; + } + + die "Image not high enough!" unless ($y == scalar @img); + + printf STDERR "Found image $x,$y\n"; + return \@img; +} + +sub image_store { + my ($image, $file) = @_; + open( my $fh, ">", $file) or die "Could not open file '$file' for writing"; + image_print($image, $fh); + close($fh); + +} + +sub image_tile { + my ($img, $nx, $ny) = @_; + my ($x, $y) = image_size($img); + my $out = image_init($nx*$x, $ny*$y); + for (my $xp = 0; $xp < $nx; $xp++) { + for (my $yp = 0; $yp < $ny; $yp++) { + image_copy($out, $img, $xp*$x, $yp*$y); + } + } + return $out; +} + +my $image = image_load("meth.pbm"); +image_border($image, 10); +my $out = image_tile($image, 10, 10); +image_border($image, 10); +image_store($out, "meth-big.pbm"); + + + +# Chessboard +#my $image = image_init(5,5,1); +#my $big = image_init(10, 10, 0); +#image_copy($big, $image, 0, 0); +#image_copy($big, $image, 5, 5); +#my $extra = image_tile($big, 4, 4); +#image_border($extra, 1, 1, 1); +#image_border($extra, 10); +#image_print($extra); diff --git a/aim-life/worlds/rle2pbm.pl b/aim-life/worlds/rle2pbm.pl new file mode 100755 index 0000000..4fa00d4 --- /dev/null +++ b/aim-life/worlds/rle2pbm.pl @@ -0,0 +1,46 @@ +#!/usr/bin/perl +use common::sense; + + +##C 18-cell 40514-generation methuselah +##C based on Richard Wobus' 15-cell marvel +#x = 78, y = 54, rule = B3/S23 +#77bo$77bo$77bo21$3o20$3bo$3bo$3bo5$20b3o$9b3o10bo$22bo$21bo! + + +my $format = 1; + +my $header = <>; +while ($header =~ m/^#/) { $header = <>; } +chomp $header; +$header =~ m/x\s*=\s([0-9]*)\s*,\s*y\s*=\s*([0-9]*)\s*,\s*rule\s*=\s*([^ ]*)/; +my ($x, $y, $rule) = ($1, $2, $3); +print STDERR "Have header: $x, $y, $rule\n"; +print STDERR "Warning: rule '$rule' is lost in this conversion.\n" unless $rule eq "B3/S23"; +my $rows_printed = 0; +my $image; +while (<>) { + next if (m/^#/); + chomp; + my $source = $_; + $source =~ s {(\d+)(.)} {$2 x $1}gse; + my @lines = split /\$/,$source; + for my $line (@lines) { + $line =~ s/!//; + $line =~ y/bo/01/; + $image .= $line."0" x ($x-length $line)."\n"; + $rows_printed++; + } +} +for (;$rows_printed < $y;$rows_printed) { + $\ = "\n"; + $image .= "b" x ($x); +} + +if ($format == 1) { + $image =~ s/(.)/\1 /g; + $image =~ s/ $//g; + print "P1\n$x $y\n$image"; +} else { + print "Format $format not supported."; +} diff --git a/aim-sort/random.c b/aim-sort/random.c deleted file mode 100644 index e4c0a50..0000000 --- a/aim-sort/random.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <assert.h> -#include <stdlib.h> - -int main(int argc, char **argv) { - if (argc != 2) { fprintf(stderr, "Usage: %s count\n", argv[0]); exit(1); } - int count = atoi(argv[1]); - if (count <= 0) { - fprintf(stderr, "Invalid count given: %i\n", count); - exit(2); - } - - printf("%i\n", count); - for (int i = 0; i < count; i++) { - printf("%i\n", rand()); - } -} -- GitLab