From bf32a55e4b511df141e75c76f4723c7cc58714dc Mon Sep 17 00:00:00 2001 From: efischer Date: Fri, 18 Feb 2022 16:09:23 -0600 Subject: [PATCH] Implement matching using jheaps PairingHeap --- .idea/libraries/jheaps.xml | 10 +++++++ out/artifacts/TCellSim_jar/TCellSim.jar | Bin 1573566 -> 1573568 bytes src/main/java/Plate.java | 2 +- src/main/java/Simulator.java | 38 ++++++++++++++++++++++-- src/main/java/UserInterface.java | 6 ++++ 5 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 .idea/libraries/jheaps.xml diff --git a/.idea/libraries/jheaps.xml b/.idea/libraries/jheaps.xml new file mode 100644 index 0000000..2783e46 --- /dev/null +++ b/.idea/libraries/jheaps.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/out/artifacts/TCellSim_jar/TCellSim.jar b/out/artifacts/TCellSim_jar/TCellSim.jar index a397aa9172022fe051f8daba32ca6e328c9460e8..e6c75dedce2cff079713a9c3362f2a1dc89ddc04 100644 GIT binary patch delta 27371 zcmafa2{={V7kBqw^E{qo9wV8_P^QdthD0GD$xw!hLUL1z3`JMADPzeH8mLS~G`vJ) zXbxqTF$o#IeeaQX_cZaZS}B{;xK>ZagUq3{MgmFA`!kL8GIv5 zDi3LIshMbMP*>{5E3rl-CdxIYj>tDzx!DdNTj;&EH02V-=b z(?7cG$zwk2?s&rDXmwn3YD!njDPn70cjvdk)$WGQ8hxc!Gp;-Dd?xTo$a2tcaTmdi zb4s=k0zgO=sX#el=WQX2gB@j7>eooSbP7VfHCo-8nJOyw(YiPXQCSEy><)|e?bqov zxIeOepR|x=s(C}#eBRGzN1BMdC0cuSok%@?HDmmyW!x2!$h(c~O)=k^*aQWFJ7(BK zKU^F6Zk~MU`oJ<8R(KKV*ZoMCp}wnD@Kt<=ZY-n1;p6oAra1=NoX2uKzq+*P-u9Ci z+FxK7f(;LkzuXmG^cY2-N%iE+T*KjYTJ;hB{$UF#C(xh|RvR!Xd z2_4k!`EYurv?FzA4EN{Rx;IAr4eT6Q4D_B;%HjfQ4b1WE0(pjq1p7u^X58Y2E(W;k z#uH0&_sj732iw*Z-P>`RPk*}$(Q~CK&aBOSa$RI!$vAhZ zw85>(HP@i(-aDg@Ic(dramm&^TlV$v#``>Ls%o2UfB&_}s?kpL`wmO-U3x?r3%R6Q z*OppZT3mvJqDC|`C4ba6*zh-P&$^+veC!6t!qqr=-59Ee!N%eZaE8&f|GO_qJ5 zVw>;ndl~ipQ-ks>ANrXofZ2py?%`8sB`J#v@$w3j#+aFpX@}KlIH&z%IwGBjdHE%c z!hZgfV@xp@@?!b}bLI`>|GvrhR7iIh5QS>cux)|9}|%qmGWI zX?P{jWFnVOq3;K)a)P%ht6AMkvtIY~5W1ZGTt}IME^snO?$hEq(P?m~CC_Cph9vZ} z-J^?;tkv|CFTNiioNL;?FaG=ItwcgWu*unpke?Tc`5NZ$>3Hu0p;K>!SSM~y32G$V zlEqQsxf}%B=zAF7Zqb_CtbKvx%P7e-rWzTDrU-BImQZ&y5783W%JNK)7^qNvxpZdE zV9Ux&gV!BDEE|{TQj9nn)Lh#A*e^NYK5Y@!lRR+=8G9iVmUQ4C-_^2x%WV6JG&^|J zCvIhHjCu)$rA1s8*})zyr`eSF{hUK?!8U%o6%j2~O^-_&FO&D^{vNewturqF#&a|I zHhVo^ZM9BV*6$JKyR#XVp++q<>K}E&J{ml^;fhN&NQxSz_ZCa38WjwCYxablX6oio zfw(-EjHf333N$X2sP?NVtvQ_)p){g-36h{f%W)*~8PBuGvP%X69ryI=ymqd17znpV zTMG3T9LqV$fBfY4UTt=}dcE)W`lr>@P=>-)`Y*9ZZ7&XpBS$vxhZIjIA&}jlSf*O7_l<{<~Z?SD2D}DE@eIre6v%FE1y^(80v9~DDaMH zkJ3pxqg!gaWmGp9X*2>Qv)???3OdUoX3Q4;Q}4!iwUC!Fd3sju7O!Mir;{`Mj-I;L z*vNbJ!Vu8@#HebJI&qW;Rj)Let)>^MQXGMGS@yHwb?(H6ND~##tCV9?{4aAfO zZnVCvM>P<&QmOg3{)`e$1>dy3d(AzT{u0mq{8+9my|v#_7DKUf>{^jqG(xXNUtv$> zQ9FxY7HjaM-<~@yGaIO6tryE=WF!79@$BZ`ReSEp85j?8h=%Ry?>Db%Q*`ehY5Vmf zi1l^iXy#*|4jZA?xoO$ZWbTp9=D+Tz5tq;C%aQ!X4UW}mjDCw(WQT*KuXgRereiA6`7=3jKzZez z-}PN_kFv@%GT8m5*>@}^vKK~N@BO;E?+$11)#Rw82hzW|j+N?~g0T*;_GvDjdmZyAq%c<`tUVRl0EV1lIE=evYx!tGoljWM6=l>Mf;!-OxIrM-Q;pM6@zhZ z^|8RJuQ9oX@n0Lgx7n^e5a+0TWG42#J0^m-!%tzWTtYScL>DMKNU;~{k<^^k?l zI=rC`L06>mo*%i(t*%s!q}~{j>OAezTkN|f8$XqD>Diq{CjnOJ{a;?1%(^;{(Y*R2dQr3KfHnJ2U+5ZqSXp6EIk1WqfNwvGbFrzD<(EI^6-NWIy|Q*56) z-Wr87zWg0|`HNYYC;d=zi&}pK|A+7J(a7I$CPs4;@yOn$NA&%giCKxut;buRood)7 zQRRG!C!E#lQ1zkC#~(RX)$9y9nhX1ka_(YQ1ZcweCO=V zj#81!LBEKL=P%?QE;x65b)kNotICa$M(x-2=iz^q)o3l#jhF1W;oNxIWtrzt`=hH( z`x%cVp(h*leJ0(~Z5Tt}$?(WV2s}j@Slzp;@?RfR%^=tYerk?v%3)BVaANI-e#l?A;AB}c0Xnj5! z$F850Qg-;SY@%~1zuoxLJ;E9GC65-2Ha+S;PuLnK-7I7HqIov<;Er?I^^yn2Ba>66 zbdktQJcpQ<)ZIdhWOd&EwR6|A2$}wg;i_47aAmL7a`CmxD(4u=9?KW?qjx^q-bnqb z>bNZVWN_f2_U(^TnL+r5pY6P+CD}j9wU=3*#L?^CqFM61N_5j-jtyV#X?#K&w4!?> z#b^_-{KY`whcH#t(v+`cVZMw~5Bjz{W1?xyO&}{q;~U|I%aMBu3e^kZlE;4tFRnFF z5p|;ImyU7Dt-d7AOuI_#8X8wAx_(IY(9u{mY7asDl?NwSgtSJ!TH_SAK2yz8;$bwi zAf>0!5DnC(xdn*JzqfTcnY^+kAhE7z8dNIHTo3b&>2B&6p8l!C*TsG0BY{40u}ib( zaoDz-Q}^YK9y(Ebua($FO*~1J?8&fP+GM3G9=a%f+P-?hZLPG`;@w)%k!N&4ZqDg< zZ5t|*Ym%84YBf?vVvQ`jz9-h47O+EwG*V~p$bT*j6BW?gLDX)RxZKx$*=-@l@oY6$ z`s&5TjB?^sxJqou(g{Jgw6&-sELuNb-sAK8-7(GoA-gwcw~+Qug%4X~xLPOaqN?S_ z;%@fX$bNZP{6sKOq>HZLn*%R(%KPz4gn9MUp~Uz^-Tf9cqO*bRKK*aCRnPV9UX-$k z8`>L8`^_sD)$EocF4zfQe0J92V}V+X)!i89#V(#Jd?gHLBU(EywnKPhG2@&&2}M3nh1SD+#GOax;qs*FF36NwQ2c z|EIj_O=9=KI!m2<+AhUhe5~di-_MKRXLwM2*uG6=;?9xH!>s#=(M@^MTE)9}Sya)L z$N&25wi@ktSl8iQJMp=N+F^zFX)eB!OB&ngO(*Vb6)Ar{kZvXTLIuZdBeieLb>D%p zfT+@k#`$tLSE&bA!z`(6+sy_Gic=9eRoC4{H6K10nN&%!t6LvvYj}G6L=<7<)Tyh- zS#yUro#W3i7+jUy!!|=yoTq<~{M+l=(yhIFp5w1|%B&c5N=sjnJ6RNJ`OWUxtS8mOjny3rz7}5>dC4yX?8oD7!9k#!)^GoQSZ;>LzN42^<-*@%! zRkbBGB4q@jd@Wx!1?Ki~F;!K^w5_3?sY48w?`P)~FEkV4ovDDbW<*U8ou$<2HxITs zJAbR2$m>J6>>QX>o6ePrcKI08o4)la5o5kstDGPGQfc;-99c(AJD65;ZxvZk&DH?Zk6>-;?@`5S0L$!2p(l;1>f1?6+LU_KrW< z#bERby=u8CUU%;h->ImFVM{9)7o{z)81x8_3+z7M^`skjmgn8Ukc*5CDy;9iKXH`o zzs>r-G(+*o7Y&_nQ(EyS8Y||tyW$le3-#Q%zNyymwY>R6FsY>J;`=b~VB(MIhiw&L z+jHk(7UM9_Xz5FozK&11Wv)JLF^z!&y0?*#_l>>KS?x@$7tsA-<0xBi6 z2zS+vl0K)>sRWd<28{)tEGA|8o?hY?n7D5h9BX(f^zDdQ9igdKzE)(cy?U<1uu3Cf z(#!Fo;e!s|oAQc>n}*|ey>dH2Oy7ztJ?!#CQ}xx1n0tr9CAXxs!2$Ot$!G5r^S`?o z<9gERQ|XU;hb-T3-+JhP2FJ-$PTnDwJAH(K z>(LNsx^#WtFJFrZcfxMb&cev39@VYilVk512eMcg?C~hu={P8INZE_3=yuUVqB-(b z;L+_FP%!!2d++V{6_x68e#vop@4Vbq(sf6uHO9|hn)kK{H@#ThTPkG3s?lvA6z2Mu z>yf$ls$B0mJ`1R5cZZnO?sFYGwe54FQ&L(KP3O&+>w$_aeV6=c9tg~T_W7W{V^Z&> zo%M&Xm2HVeyEa74ERapUg7M?B(7ywQAR_)4yyN|`*( zV-M3+qmxKj6xmFqwNUY$_xzUCQnSkDW}Nk+P~$fq6oa^zQ@Gw9&EB z(XS(`nk#io(q>w`)FZyVy(^((!rFRZ{JIQreAwd*tK4+Yd^^X~agw$1C58Oxv7WHK z^ncOcGs=&ss6Q<>64m7R^@Q)$O8t9n17g;7{Fd@%9N8A6Oxex1Qa9s7ebmg9EyB~% zH%o2yE84Fwd8wvpxMy?5g&X2$cfaTQQ z3j@Ucq|G%=KyGsi^NHGF#)*?ZX4qUW2gLAnoKCVNwq^>&j^>6f?M{3ADO2d;sJpVu z*Ordwk9TK9)Mc~RN$8ZPjPZqrxjebmXc68xSftSTyH%*VLAm>3)O^YwiGXeDg0^4z zbIm5%uGZ`}n^ZD8ZV_IUKJZchc(zY8?WtAnJi;dkgk6bo6-}g~_PQRO{H+9S5%ayINFXdhe zo~BKhPxwnN)j_pw_(#HzgxQ42o7qPd`mWOwYe?3O91n*MM0V^a)tus{kvui!bV7@- z<>%MECyBE`udV>k{h4CPcMtSXk&evPWwg%l#6OG;@;Kv>J#y1^5BCB?*huMA=i}mI z57JimKUoc<9bA0wuBG;NCvyqk!{4GKzxRbzAO0~ez4Q6-kxL~?)z35KDqag@YkpCu z5t!U;8?+Sx` z^Ss(TzRa~fZc(Z)@6#;yxFxIdzdD-&C z>!ZuBrUtKG-$U$a@znG=u3-Jy>_VNE-Y7%*3317Dg3Gu|?MkY*Njo ztOkQ<95Q!t2kF?qd8U#e|7@(po8}DZa7Sy9z-OG`6wSlmh3P^!c2vX-z4@kcB@6${ zYcwS6GSY7GZt&I~gYq|GVHqi%rz_5ViTuobF7sgiM27 zTA5Y@T277mK5|!X5z7OWO26%PdVQ@T((8?xR)*D3XhqVIqO|eC3wv!7GYYT0wdKz? zoDj%id)VnCaI;k)Uoqe&i%y(aIEzuJX7H>h*YLPhgSsu+tM9yE^`ZG!r`i{z&&xd5 z8%~c{MqF(BIy`zbBI$AS&ioS#%o?CK_s8O|ARJNm4(jLvDO#7} z{XuEX1ufk+)%t^PuK6-e*l>;*t6uQmeQi!o^}N5s{ZT~qioZSMh}xl+kM`Q1bJItx zDpMwRZ|V3ft^2DG`B0=k=htoatGF~MTjTuX-r;t_Sa_I?izRE3j1Q>J60$$l?lFe@ zP%4yv;HQdq*?~OmF{1c~5}n2=V#hB(L+f{+=92xkYy0t=ynbgs;`otiDbf#_xG$F@ z{63}g!~^57FDDu5+&)_Fd>}Dm^wDvS^P^Ek?@76pu9N%`y#@*&Pj&@SL^mRwc zgT14wAEOsm(6GjN^{~#9XTRL58TI>Zx^%OS>B+6mn)$Rj{@*imS;V@mh$F0hr})oM zyd5{++@3vwzIib(GpaB@K3YEiafI`C-JJSw`H)`+mTFdL=h9XrmY%Ni ztq>Z1TAR?E8J%u_B5**X@8zxYm+@WFq*Ouf%t+HaI}YFZY}?B6LO;CR6L?UM^Iaes zaNjXWDc&pNBXGN7PwCT_L|W%oTjnt;KI%C8!fu{~iwO)qceO6uJZ_(_b)in#o)i&A zpJ2Zw&u#W&gyoBoj*xx%sb%&@3fr^%S{pc?`Icst39Qwo+QZvWjaSZht) zCD|OU9bJ4l#6rjOW4?5ulPzg+VoS%7V&=gwLBExkc*ObT?h2QDP`YP#zHZNjE+5^v zlB2}k8A?E}=BPrUqOn!xm{oUVQk>31zrF17%Apl-eV@*}APu`-~44 zI|3{BweI=MlW_KEV>d6)U~$}{U9hBa=vdh5bq$N_yTk>zNtvACPO9JSQhdT)X7_M^ zrf`lDZFjkMrrq_a&9_MRN{NG8zeTLE{O|^(uC^nYIx4s&^x5dF`5jA>;MAQ9V9mrWBhW z*+FFnt1W>FL9@pi1qM=f%BX}jAzN=BF2BWPZ&)54LMQ`J>4G zWDxpkSuwoTz&6%#F{Q^&XrRq_E!DtE2>*jQf4`6(b*2R=sj@kAbL-b|jjS^jnI@w7 z3C0ij&daJI@4d9PCm77nh_`UP3Dv^A_uz18e9`_>%kh`}54Vg*qr+;3#2Ix}Y4*Gy zzJ{apPFXGNH@Eb?f2LyT5*6>3e?-dQ%q|!Glb2}utj-R4zd@TOcYOF>p0VNreCCs) z-+UNbs1?~PpUX7R>%QMObbr~+Om|sz&&HR@yNoX$ydX7&i0Sj*+I z_bsL41>c9}i{tAAoT7Usi4>`3vPsY>N&lDD);<^CgMx;u6_->P8Zy6_@ZqujD%@!Q&}DeJAgV>c>o zjwxLZqQ4xp^>Pqz*Zznb;@t<=9-0uB?q0CJY#x7Hq{q4T-1zapb3gHpGK2Ze{wC#> zZIaX7`vzZjyf~6ETG1Mm&=>Hktt&OC?!sP8*;?hu?~>yUt!7aroxK5-LZAGZCo5=9 zIiJ7Y(|6!V;1kslMf!6^evE#Ntm7>r`apMtKE~mrR~|3@m}jqO<>>#Rt zvV6g>xKvnQc&5O@ZhrGtFRvjlhVDWx>0NIaIpV^tr8UaA*6#GWH~jc@RVM4sK!`MV zud3lq`4D4dWQThYP+cJyJeFNCx zUgfhqrz?1VhqgygbY9g8xHRWsaX$K|EpgnYwW?pTxhG%rZSTQLGgp)RjQ4oDUsotm z=-uqGS>|o!`Jv4Oqn_Ua98yBrCP>pjzRb>Tm%@eUNk?7Po*vqwI-qf?Jy6svGG$5p zm<3}ESH#uHf+BO(M)Om2)tu8+9Hai+@2has{q#~Z4xM!VH}q9pNQ;K)PmdJFzkQ=Z zRB`LB%|d2qoFa{HU$QnH`xw)8ih=KrU57VyyQyDZ`LS&-t#U!)w4+x3H)$Uw2pKfa zGh`c=|2P~*(j3vg+-~CCx7v0+DAC$W{nRnFfPSqn&D6CCTaKykoqn&C@w$IUxX|0# z#oAbfzRKF`>N7^QX$nJBL}qJ+hT)sxa<0U-hqK(_!miI)XWxdZyS7@-sxFIV)waH! zDPQDY-s<|Ac7bMaK(M(*z1V}tkH44Z$fw(fl|QIGw(p*u@a4|;G)Vi{cB;t#F~4e$ z_So((MP+@byH&%58RlsBuE>%^morOQI-4t^`BIN6=r+iHu!PJGDbGax|qJocc&fYKJI*N zP}AX9Xl~aPCaPnW*OOI?#H^cNR&lS1xO`(?Azn?{UKQLVTR+?~cjA6mocA4xYO&G9 z`MO%7%U}Mhj@JwX9F8}&%+CDyyv%oy!SU|+v551d#>YQ~E$-DUGFx6$A3gEHIb!w8 zL~=fH{EkZz;Qy%ILHc9dlI)CC< z{oPZYM5f6L22;5=Yk|WIsUk8v&mn@QZCN(>hfbIO&KoU@JI*{RwJAIQydiLJW5wqY z-!j{`Pb<*zZ#7n4MKV_%#~6MxZ?ka8)wI27Qu1@AY7~El>Lj1u=dp~Dxntp7vGVig z12_3!)tvGu7aZuKRgM2nTgYd8YBpj^^u^&_=ftiN9maOQK5v9{m4L2i#$Wi_vb{q( zL*^eQe@ad{x0l>958)1yX8+h+s1{k03t&a*&&B2Q}%DNztQd zdGUdxt|_b&Le*CHK8d@A$S51xnfI=#{?0tpcF^Ws=T^i!8C70rV_W%nF5F%IX3T5H zq5B`7ohB+jJ6*7#{Or^xol{qu+3pBf?ad9_**2H!JiwCZO11AX)tzPf;-Qt16ry?K zq9;t{2^eu+7OI~;H7D}Kx@Pg$9DWVwwrCR7PrIr43UP#Sl~ZPQXIuZ1S?|@TErhn_ z#i{+R**`c|@h?`bCvJJwpDx>$`=Vj6Fs#YLMM^B%=Sr(#f@jEW{;=DMGU1vEosV1E zeJ;(rP`4t!y_I@Tq$g@lh9&xMYkB^8Zr4N&?;L*FG5oF1Vp-KV%W(c>``RsQDEqiW|;46 zlJA_?;b)wG;P^Z5aHp}$jmFI|!@a4f#&mW;NeXYEIzFy3mxdi(8u3YzC5Z@3Z-_9 zJ|sRp(Q6h;*G#-hl7f<&O~B4r|2_Gm{;C&+c6*E-v)6rHcx>*f^o_S&Az^!W<*;@c zE*b91Q?Si@*L|qX!6@@qY?bb=etr9=c6+w&EmqDdkq)`5fe`O%ChRR7{S>qNu(o*` zq8cYYwq3`%bx6jZ+qJydw(S)>cQ%FYZyi2Ue9_e*Zeg#l60tC4+RK+$*rw&0NvTaf zd&{8j&2$#6eenyfxmNYVzQI?0_uwjxJzg=s%sJ^)=uc&J=(t+Y6SFgn^jld|r1q#2 zb~vQcCI3ZR=qR2@GzlFs3}$4L;{TvPgM4OiPU#FvFfwo(wv&_H&EM@ugSfx7=Zo9# zTW2i6-=k9WQ56|1(g>zCX32bZFnEhG@Ajn7G5Pq+?Z7wqA=geRLssus&4!m|)e{{3 zby!a#ubRydric!+yxf{v8Gn!EO?UG9Xve?e)K^&3>ORz-vnA@>N?+Jfg|HajUncIR z%V;%!d@7*x!ln*cLG*#JwF#k`X>JT~Jt?WJ4FKj`Lno3*bT zN)G4ukz~*Z)my53swSx})t(N0TJ7Sy>Tmyp4t*!&?j^kQA@WLmjrB!4&-bp+iw|v8 zI2M!SCJEiAeh$k^tSlC;e(%Vx^S$!eWOs5L>9d8-Pwk&kVX@(BtTq<3bhXE1$8_)8 zgtO97-o3i-5#`2;y@mCHB!qn#B}uZAU(nk0kN?<7x#e7x7r7WVZKB&md6A10e@)=( zHJbmRV5Nl` zIEFYIDdO6?)A(z$nAwvUXy%j3Nc!|g)$l?9DDqNsF~fJy{to$%e?|~Ek5H2=Q`Q|p zHYqTb3M4Kdtp9126qhOr5>05RNp*kNEh+L?r&dx_u`jqj0T8InLIeC5QKtVm_`6NF z^R(3eQNqrP07Wj8`Tv4nO-27SBLWhQQKo%;RK+ZYze_|mQ3#mOFYaL`i<>UqtHh5YHv4N@cC^bnq zW8H&X#x^YAze#5^gfU1jm|6sg6d?%HzXp3F3vRR2)POY;r6Dn8{ypMgnwpU&WsU8> zxu+BwsApqm`%mWJV5wsb{wY)7M$PfxIwh@TZpG3jdmSr}^PbnEJ+I^72M<34_@ROy zYWSgnA6odKgCBbMVSpb-_+f${X82)&A6EEbd+2$c-FFOYyfd0Z0{gZc&4E=SkdNWO z8U@ZV95R@e+gA9!7xYj-S*Kx^hSZ!uM>Z3q@Y4h)i zLz2BN4DP%|nZQ~d7nZ_@%#XR&Iya1zuy00JxwRL8%0(EkrdTpm&Eih(r419O##Qf6nwpoy9as)!TjOy44eMWASiu+^5JQdNutTz zEdNm*%SQO{YRLdMiQ{7XAH%z3?O{wySyjP!Ho~-?p>gOmXI)2LT>sZxq!^mNTc-qe zB8(s+=Z|?(KGbnu14{P@=>J+$8aBQL^tMt70mj@vM&xJ-XRmDnwi5^^u-L$r9-@4> zJK$t4A}sRXTnYaxS6`q{DQeOGZIK)gjvwIikj?)yCjWL}MJDl(h$&3}P3F=K=pzm! zkw#p!z1l zh-HV;RiQL+>=rW$mN)#fk;~0CjqIP36p_aG-`rF5mndeO;CunXjd>$y65o&pa6YtL zq^UF(@Sy-<_@5g2cT6i3Iw#33ofZh)`qM#*r)}wEPh=G|0WCOB+)PFNa8M*fv*r<{pRUotoVfz0}0v0e+gm8hiRW_FYjgH)3oCTS&{yZQT zA?^Yh-~`jt?99Nq_)j+}!(E?wO_u`&SsQ2|dE)#4e-$Ix&XAH~oCvTkL4;)fU)3e` zuMRts4easR*TKwo0w<^{K@{;rxo{oi1gj;84*vH|%J;-lgpQ87B(p?;!|CD}#RY zYJn{;ju*6*L93vr6v`Dj92Zb1M-*|Dz^xpy#1H>P!ZmLLtoLB+Gv&}K`xWNv4s5of z9k`dnRG+_t=;Eil{xrf)lJBMk({~VQe9~J8askD=$ZkCK`#;}Vu_)^9LVrI$Z3F)6AD@iQVyddokjG*xzw0Jm6>X_XMh%exCm#q|`0zCI2y7U{^ zn&TvZ<9%c&US;)X;~Bgs}GI)ooeIABwTYy&x!P&KmyBa-Cq@&FwT91UQ7fJhUfwQ->D9wG(~ zJV3U?q=N^D6Jgm1N5bWC0U2W)C*XewX|GHvzGT2(jVK35q=9oP_94OxgS+t%allLM z0v)w5n{1B|ZM>N^CM32XFqKabY7p=UQODo4!{A;!92X7{0$*$pTJD_He$+zCx|hg z_xT2sl4(8sYV$u3t9n?I_u4QdryeoG8@FS^T0LTopX#9qFyjK?Yy+Z!Kl1_8!fl5k zKIzkjzzkk}!m$H^{y$Z_?QG$Eg8eU`>%)4`Ru8X$tz_?BKwDnJ^|skwBANsR zQ;Ng|SVQqN0M;oT2z-gC5)3W>#$nNuAr~7gs5l!uD+m#X^H}XKn28<0_Alfh;n2}_ zx9LamJmguz1{R^3P#Az&ZEZ$0@wvg|NX5YCVAxa26ewwioW7918xtqv(s;3OtWWSQ zU{!+L*}wHPK)x1^#G`j`MXhat#&53Rfo%h#00a_YTpzh$Tw7j2JdCuCH<94P9EJNN zkV?iEk}2ur2FPCxLrA#Ot4~r()_U>=oU8nC6FM+~_Z?A8=PK3}`wKbplW81|kHu zSHpBgcR*tHmkn4LeE))H#+>{h>lD8ILl^!H&jhUAz-nY4+JHrX>k#bhV=^2u@ef$2 z6VW1^nc6@O;Ld~Boya~y@(PA&cfo~y6Aghp3*gg^hQNa@9MxU0;jeTAa*1<+J9Tj7 zo$Z2SZp95DJ-i4o?}l~Ei>@0|%G3%aFp#aK3H7`bLvAq5OITl2IeMVO&4L8Vl+y1( zba1L5vIjX#z=;sBLa`7buz-XBSP<%OA@_*rx{nM|h*K&znv5S(S;wp1BIfwF+kx#n zxLx6Shp6KOfz3O_43`Ab-yv4`Q4fIogrI=$5P=tDe}F?G{T?ne*L^YA21i8)dVC3j znC>cB_dZ}lM+4XbVKOLoKghcLV6u)ENPU10jhkmN;>8b$0iHe<6EtE83Sj?F*pTQ) zXwVvu!K?9v&6uAUGTfVj!EAuQhrxpo#xyJ**H$0N&%D(K;uK-pfMF7euKvEET~|0 zQ>g*50Ys7DYQ1621In$b#K{KIgw@>?k~*-lqoM`$?63-@24UEpdnmXZU>ingK*%8U zFtncn>44EeXjpS#-Eh|sqJ&EX#395TcB+2}IZBugpy)OOg+MB}{}_h!JwfaK(muec zKRFDWIF><<2myH+RO|I-HUeRWYzz(`K}-p(xtO4vOSN9F45N_q<0b}ck0K_7=eMcg z4j5*DlHBJ|k9!3AM-gv=Llq_W>X?Q!1}*)cW0u*^|1>&DhTUFaFswTkpfHZ?A{>8% zA=kzc8^Y5Mn6NsISP+!HVFIiz6oh_8ZSBtY$o8Y#d;DB_~{8a zDk>8&rh~wG0`5Dyr!j5K1T5v%Sr9k{=a%FoqK7B`#DoGB7(?PD^rZU>L%Jv7es*AK z!!5i*o`MSrd_+&d<3sN%reI!!UE*(q?ct|km*{cSzCz!XQ#3~Z(mX`DYeJq?o@ zNk8N=@F9Zp6ywo6R2fQYfok8~CzJbUYIzC8&1V_+)9yJ48wWnAbwh99e0?6`98UWA{k+X z-(3L63mg*2+%d5rU5yh{_L;x=OJO% z0wV;^!v$>68WZH*U{d<#;dZ6g0YfGnsF}ddUoh=S`!VF)FSyfNaosTB#GXyG3(#qT z4+cN>q2|HPB?rmyY5*CQ289c7S+)Uv3y3qGKM2EIgJ6@C2Y=Keq^bsE9v&{jP3b2v zvxpqRe?O05{!1`a;ft7Ha}i!=^e(}`%40F4FP54C$o__d_v;EZ$f0H72XcwfIpz7A z^cyPjHOb_-5=_?Jw4_~te;EC`mC z5hc7~H^w>HP0dHPVgmsykaMU9gQp0n0-!&PB4C6JhYw(I*#N8;i+;%7y$WH;Q4HQU z3QNM88a7l#hN~tv*gSxG4bi}D2fAx80nxw63SRJJ4W4A?nSdS+@u(vHnIne$a->-g^%foy-49^!M?7kbrwzaaO#-To_YB5_HENU=WChc3V418T zklkOzbTCL?yhbcp;01oMG$2KaL=m>^4y?!x0?j>(!oo|%A2 z4-Ge{p+=?g?e8{p`|t<*!5tbn1OYVYPCRakEbPHE{=z^3S{Sh%0W{D;Mi?z>gzE$K zw5TH?h@TeRm84Y%&-rP&fWX?H*>Z{w? z86oGh;|2!-YmBHOZWt&sp=aPfWlZQk!kG|SQY1iu2s3H}uUd{Vqd|lzA}#0uwAw&| z1yv-doF_BjBEX8$0l)LK+#rqx2K4|?NJe0VEajzbkjx2UH!(q*pAJqBR#cyGyBI?P z*-&;cSxid<5cPZjm^l1HqqvE3F9oS?DmTHWzA4&|>>rg0~!Obg&8X{$QL78VbWx)!$wXxlvUD z6F(g#bubY^;0`xz8mCA`DCuSg)Cg)s*sigGz%vaS9Jg2mdPA)-Q`iqi@DhPDNn$_1 z@xb2KYoMZlxSx&#SfX&qKODf|JE{!KK*W_!36!e9$vTL_$=a8~gNERr`)n|TfsilV zX7Gsz8n*duz(PP!5H{@03k$|RY#kOs#X%J>YKZSSvw?^KT|QVsR^S*P>W@1K`uNaG z__e#3K9(PK#%EM+cohZ`0;ml>y$VAPNWl8Z5`a_u8QfEnd-5k_E+G7vjt1ClhH-Bb zgfXQ3g%SJ(QEU9Bc1+L}N96&N5UPfE?8FdCCZdE;6a3-#7?S-S_Kr;$_HOeR3<*r4 zM?ugRI)0EqhK~fV1nJE{xFl?fS{#mv z6c7aP>lHp$|Kvy%SSiB9 z3dYgXV>8WG8k(plVFWltg4p4=iVT|;|HF=32Gz$$m179(tpIkvSu6vI-p?_3PzGj% zsRa{YO$h@}S-3|3ZY3ikpj8$6pEJnf+IVT7G;67ryKVvKf>bFDP zB3WnG_YYlSAH4*o^OJ|VGgClR9Nh(aMh5@mm4IuRa} z4-kLCg6va(wJ7%+vsaKt>A^uon6ks0K&~b#axI6!6r06NO3+-KKt{I%Hzhc}52!(| z1}w-aY6cUms<@OP=L0s0nTn=&7MT_%?5hKuOJ@8mfb@^CKfW!IB0n zyD)XwuF82b@^>pL_}Gh>mFjl5nv_Lj0;S@qV;ES;Axq<5U!}k){4nPUFi z6Kxp9K%FrpZrX|=OeXO0azdKi>P`@^4-JY?0f#uO?1|N@G^)LfBJ;wFP=57u-1Ns~7qrfi`j!eBd z9KtxGjd2hJeMT_hl@Fp-afv0ez58^B# zm1u>fku`{s3$$1<@_?QEFlo45P-kj`wG4A1iv@iW!m!ShcA-b{icXjoRvsIWwL*8` zk2#Y=+6Epw!)S7>V0E_a-w4tc&vOtnfEm}q+!a_ucmANk8g3zEfuaq15?_7c51cZ0Z%Qh{aQ z01K)O%s9Xd*#Nh_s5ibZk=%RAY-R*yZqNtwKIlXDD%ngHo03P!NInT`4Av7bsN08X z;Pv5;KkJi&75pxS^IOpomeM#pzrw$!2T_jju^^WDZz~26p2^67jhBQI>{lPqbwY#i z6$Rw>gi{n4*@1irdA^e;+cIR}g$l{tF#;~m(E0u1f49jB+MQu8g~~yPD{6*KB+cz#wL7bO2Sx3&P)W zT;cY>O^HbYbKiad8XTU-3~YFq_yN^zn6~Y%5S~~f!{#8%6|Ug7K)Wj%hv(-3eQu~a zILgDczO*#C!H)BTUNJ4!7xa3QQn!o{Jx#dC$qaHinf2Fe=LihZj+X-Qf~=$PdO-ImJbz}1{|%WD zyrkEq3~6Q_U=s)vD&q$YqZR&U@d9TL_$mtJ2ZUU*GE|wOln3Aa;GvjSf1RqS&&-Xv zaPfz%#a;h&aoZo&AjmqcLvBvY@UDc?S^%VScu;V7$M3<6kQ|2UlZtNEZV7_QzHH<($#z7UuSniH_<_X5!qs3$@FE;CrIhT&zOKphC* zswvV|V15$vl!72H2UrH7P6XWZb>5R8_}Ei;1$IFt@OTB=EF*J`gCUm{xCf(7xCu}j zj2^`WbEOFvXj#aYZ_?OrAKa&)r87`Gg&rjMz!S%@0)!vj zIR&=@@Qw`^ikg7Z?JNu+P>_X_9KJMuQ5=I?LQoZ)X-X(O09$U~V6ua%`9JgOYbaa^ zDs}?*Fc>RO7~GT^1Gg~vFe$XbuunEDN+2@~#xH&vQYRfT*zq*Xo9Y2fs6LIF<9mI8 z`&qd7aQnh2DA#mG;V^7r;1-S^!YhYj)V^@I&L0lL1oG>uASa9kZo<#NsEKF)0pC6Y z4>X4^`~zW4XQ2k15vUS=ITnN6BH$gJ`;`q2J*ba>%b-Qd20{Zaq`+{Xd-xL=5ys!0 z_75HO$PCUBVbk_mSnzRKa5v~oej8;7vf;HC?ksu$cN(~zg;P(p3bXa8Vi5u#PD7WH zk&x61^djK~)%z9Mg*>?PiUlDbtfUDgtt`Nu{Nj(_d3cSm{~Vk$m)>9y>3TX0_6>^w zkUJ0kygdg?nDNs;bZqBQ6GHmH-wqDKGHXANy5h2cViXzxe-_D!g2R--3UZ@h=}2CH zTgGe@6W*e%9N<$FbX;)(_IalS23tqL^Jh;KT>p74LU=?4gGE$Xg+Sm%m<5|1U?u@R zaI&J|t59_p;Q$otVMwnYt2TC8^ooY2ZwxnxHh5q7zEcA1xKIqLir-?53DYsK!mh-? zCrdSGh=H4d@;zjQGWflR6;|pc*xEfOG9n4mW8rrC*+tli*-Oy3{$UJOiG{m{H{Kf@ zTl}Y3vLFv88QJ*3&Nxur4JW}kYxy>G6vrGuh#y|nQ7-j7u0lec zzy^V0OasZ0y9K1bwN7ngi{hvOrJgmy9 ziF@y>XdrO+1Gt2!h$x0j1_p|TX5gBsSSct<807Mm)mOQf^(l{`J~*L*Yni*ap&*DM zuIyq+Ad9;Q3W_NR^8Ln1c9S?Y=N%`&Uii3jaaMuQRGIP&Tma7 zRV?OJ(toqxQtk_+ z#x1teBWb=rxmlnl&q62Wq_S8RD%HNGrSVSMPBeQn!i{$kk%Drel~!7#XxWC%m|A|( zC{o!PZC7!Z@aY!d{vBo9k#=rjqojdOGBr#HjNA$V$ytW_)7!tHp$~KDlA8>5q3W%O zSRy@TsuP{})apgfTj(}aRWD!C{K|$>@eVXbArR?AfFcP`t;lgZ+`a#y0)4+72g^=j zGUZ5>+u3{4{W%IXWd|hR{6djT+QG)Fp5l;#t&p--Dq!1H+MdGc2fxCS^;+fAsbN|T z_xw#&9@b1YT}qAB@(@!`<91?tYKYZ#8oYtraEjWD}&-2?~_G z2fOG!_2{!xe}}1IXPQO(3Kudt-Y-MJgEF)}GW$rUe$-T?q#2=h>ZKNd$yu!`8q-up$FJR_2(vz^``Job(WNQ09$7y3Ca2$ z58{xayQ3hM97G6pua_X8ewg}6KS2zNV)H6kdt_kTB_gnAxkHX1y$6MVk+^x75y`a#(h~ z1HFC(n)ZbY!Qyb8qZn;#kDyv^d@10xBN+Deq&bSaLR`OUk7DiGbQBTU50rD1If^vx zZ~w$#K1Z5k%t6W9#xHf%k2L-SMo!Q%raU^3^Majd)iI{z1@os3sn|aYs zl$^-yU(HOG9||0%QSr=MD*H)CYr+g2XlFb^Yzr!hXa1_!sMm28pxz$AEqA5T2%Q5p z=3%J$oe7P7jH6QJ`%M&(J;&HM% z;v__{+dm1Bh63t+9P@Bhk&mU{qRRziyg&2f}vHJaO16H6!*KwqEvey>-5NS1suU)Q>}oLli3)g16rTLh)RUS z(roC9b~4yfYrS5_z0uH_Q}DGPm7HSJB&%+UOkfK0P^Y?(CJoa_gNt6z`<|=1!j&WL zEE6+_$wk(7$_$W5maSNw?cv`d(OPxix8trw^9K}3JE3TxUkMsG=3sjxZ!57@M% zh(DOWv}L%S5{K*G5RGV`3im7gxgKZwC>2Vlj4_+>QtQTZj-G~$*V~H^-a3Q2x;sfv zS)}ht3(p|zJ}`x<&$6EMFhXY~glZt9`hslJ*lejHSdn#~33ue4lbi;lqh|}}$DPIa zs!PL&zm9`0UK}94>dy12*Cq6kiSto$*fuCFedR1P&qbmq&NyP0i^7JVW8SJ9+I^0V zla7#V&7IuNqdFFC;1V6FSB~D6+!HWxHk^m)Uc1btLR6m$xRS&EiIjW+COe*i6GJZm z2~H6f7G6NdUPnn6a3}O6+pJR=2oo+s^fWSZFQMC^Mi}kmNJ_pa4qC^C9$mzU@+8+w z=pdQ&-%D%~UcqEv!k`#H?&(;9K6$FAzO}k;lzsw{L2f!~`R{r?X&dw|Q65eGyhjG$ zz(zd{-L5mz&y8sIIT`5FCZr+swJ^An<2khU6-YsCRR#-I$7!iL0|kVv6;)^rMj^5> z6Am7&YPG@1VviG3rS?CRcc6tX2@-X07 zJQwz6W<%MpZ*v|V7G`7gT=WrwB`N3;808w8oChZyav-?UzXk6njBT33;rt0LVA~H2 zc9fEX7Ay@Ca8SDLH7d?xwr0Dos!;OF#cpWXECZcN#8};%%eLPT8D`*fT^CUw4tc29zMmP$?KqlmOdfjUf;qJGis+3skMB#p>IjFnn9X;W_oop=TklUDVWY;(ctfJ zr1MDzTDr{G(e2-!iS&5MfGS!3#D&i1qs${fO;1MOvAoJ$RW}WmX(`%)|6j}o)uk)x^CYJmw9&#c2Pr&wsfr! zj&Eo!5Xx+0v?2E*#8w;IG(+8Z-j=KMO}l2unwE2Y?XE#zA4dh>at-M=p^io-iuTDh z)>(>oYG#g*_B$)o!O=zwYFo_uN!xq0go=8=0l5TU6yxi8ZY`O|uEFGmVwfE2-4g%C z+bCZcBFnV|%yzylnID%Ri6Zm8mQY(i6ns@FYCod{Mi!24W?IXW$m^wm{U$5$!pV4( zDmT{G9M23;@VHVoQ0g9{Pyr!E2YzemD#e5=PZHi zx~(M?xD90;d<$Q9-r0^6e(tZD`Fxr2DDRlP#F*Bf=T^A4OSXlvqq+(>|0Q{^4_d(%>ZyzgRv zWUp1I*t<9p%`hlb)m=#5=&DdY_b^lb?yOL!dLlcg)ESRapT)q_!}s9n&pn%&HWa!S zxKs{&YHyRd=8^AF&Rz0uhF+(Ha%OtvrJT)6lglD{SkA;lXwuxr+`oHpRJC0v8uS3u zdjJQn52n6#SeYX4Gan?>g1sU8(V?nBxhuIae8+^GF19NGpx1pDDAfgFE` z^B~(Xf|xW02Zhm9yePbc?^dA{y~YY&WEJ%IjuXVHaY$mUs76Vhsv$FXynw^1v6iiP zUl1AZ3mI4S!3k!>lEyy5gnRD;fw)h^xT+o4RHbE)pv-cT;JH4=DQ%z0g4pmFDHrbr zaH0=c)L>6FcZwk5r{J|#`GY2(qiPUPtfYfA>?`%jkGO~@*?x>-#o!MbM6rH&0+IW) zVE|8dTINr7b6`n#X;Wd}aH2bvKSvNA`5h-ZQB^(K+`Ar|1Jj}w$S?J1)Y!#lWPsX#DJSF+(~kTa zpyK#4fjn4-ib9c*=HDO(b~z15MJvJ`ESEp^y{Qe2eSw|we`v`IoI~Bj#Vcnxti;Gd zqNb}lHbNjX8(Dw#>eY(Y`#7vgX@s3tkunlxV>eK}W{u#UTVt}0nrnwW^*RCUUk4}n zFpRol=b#!HRb>}|M>K*LqO$W)FULD+ZWd8n*XD7CcLht-cE(p{c=;Lm0M2AIQElg{ P3gN#!EWX-k!odAMr7zGT delta 27404 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 diff --git a/src/main/java/Plate.java b/src/main/java/Plate.java index 32d6ceb..37601b6 100644 --- a/src/main/java/Plate.java +++ b/src/main/java/Plate.java @@ -51,7 +51,7 @@ public class Plate { //n = Equations.getRandomNumber(0, cells.size()); // was testing generating the cell sample file with exponential dist, then sampling flat here //that would be more realistic - //But would mess up my + //But would mess up other things in the simulation with how I've coded it. if(n > test){ test = n; } diff --git a/src/main/java/Simulator.java b/src/main/java/Simulator.java index e645252..0471e1b 100644 --- a/src/main/java/Simulator.java +++ b/src/main/java/Simulator.java @@ -4,13 +4,18 @@ import org.jgrapht.alg.matching.MaximumWeightBipartiteMatching; import org.jgrapht.generate.SimpleWeightedBipartiteGraphMatrixGenerator; import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.SimpleWeightedGraph; +import org.jheaps.AddressableHeap; +import org.jheaps.tree.PairingHeap; import java.math.BigDecimal; +import java.math.BigInteger; import java.math.MathContext; import java.text.NumberFormat; import java.time.Instant; import java.time.Duration; import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.IntStream; public class Simulator { @@ -158,19 +163,26 @@ public class Simulator { Map alphaWellCounts = new HashMap<>(); //count how many wells each beta appears in Map betaWellCounts = new HashMap<>(); + //the adjacency matrix to be used by the graph generator double[][] weights = new double[plateVtoAMap.size()][plateVtoBMap.size()]; - countPeptidesAndFillMatrix(samplePlate, allAlphas, allBetas, plateAtoVMap, plateBtoVMap, alphaIndex, betaIndex, alphaWellCounts, betaWellCounts, weights); if(verbose){System.out.println("matrix created");} + /** + * This is where the bipartite graph is created + */ if(verbose){System.out.println("creating graph");} + //the graph object SimpleWeightedGraph graph = new SimpleWeightedGraph<>(DefaultWeightedEdge.class); + //the graph generator SimpleWeightedBipartiteGraphMatrixGenerator graphGenerator = new SimpleWeightedBipartiteGraphMatrixGenerator(); + //the list of alpha vertices List alphaVertices = new ArrayList<>(); alphaVertices.addAll(plateVtoAMap.keySet()); //This will work because LinkedHashMap preserves order of entry graphGenerator.first(alphaVertices); + //the list of beta vertices List betaVertices = new ArrayList<>(); betaVertices.addAll(plateVtoBMap.keySet()); graphGenerator.second(betaVertices); //This will work because LinkedHashMap preserves order of entry @@ -183,9 +195,24 @@ public class Simulator { if(verbose){System.out.println("Over- and under-weight edges set to 0.0");} + /** + * This is where the maximum weighted matching is found + */ +// if(verbose){System.out.println("Finding maximum weighted matching");} +// MaximumWeightBipartiteMatching maxWeightMatching = +// new MaximumWeightBipartiteMatching(graph, plateVtoAMap.keySet(), plateVtoBMap.keySet()); +// MatchingAlgorithm.Matching graphMatching = maxWeightMatching.getMatching(); +// if(verbose){System.out.println("Matching completed");} +// Instant stop = Instant.now(); + + //trying with jheaps now if(verbose){System.out.println("Finding maximum weighted matching");} + //Attempting to use addressable heap to improve performance MaximumWeightBipartiteMatching maxWeightMatching = - new MaximumWeightBipartiteMatching(graph, plateVtoAMap.keySet(), plateVtoBMap.keySet()); + new MaximumWeightBipartiteMatching(graph, + plateVtoAMap.keySet(), + plateVtoBMap.keySet(), + (i) -> new PairingHeap(Comparator.naturalOrder())); MatchingAlgorithm.Matching graphMatching = maxWeightMatching.getMatching(); if(verbose){System.out.println("Matching completed");} Instant stop = Instant.now(); @@ -660,10 +687,15 @@ public class Simulator { private static Map invertVertexMap(Map map) { Map inverse = new HashMap<>(); - for(Integer k: map.keySet()) { + for (Integer k : map.keySet()) { inverse.put(map.get(k), k); } return inverse; } + private static int bigDecimalComparator(BigDecimal bd, Integer i) { + return bd.compareTo(BigDecimal.valueOf(i)); + } + + } diff --git a/src/main/java/UserInterface.java b/src/main/java/UserInterface.java index 9c559c5..0265f6e 100644 --- a/src/main/java/UserInterface.java +++ b/src/main/java/UserInterface.java @@ -16,6 +16,12 @@ public class UserInterface { public static void main(String[] args) { if(args.length != 0){ + //These command line options are a big mess + //Really, I don't think command line tools are expected to work in this many different modes + //making cells, making plates, and matching are the sort of thing that UNIX philosophy would say + //should be three separate programs. + //There might be a way to do it with option parameters? + Options mainOptions = new Options(); Option makeCells = Option.builder("cells") .longOpt("make-cells")