From 81d0e70965873c6b172c73eaeb505539c23665da Mon Sep 17 00:00:00 2001 From: Deaglan Bartlett Date: Tue, 11 Jun 2024 14:52:48 +0200 Subject: [PATCH] Add hermitic enforcer and gradient test --- .gitignore | 2 + borg_velocity/likelihood.py | 37 ++++--- conf/basic_ini.ini | 8 +- figs/gradient_test_8.png | Bin 0 -> 94370 bytes notebooks/Analyse_chain.ipynb | 16 +-- scripts/run_borg.sh | 2 +- tests/allocation_stats_0.txt | 42 +++++--- tests/fft_wisdom | 91 +++++++++++----- tests/test_gradient.py | 198 ++++++++++++++++++++++++++++++++++ tests/timing_stats_0.txt | 131 +++++++++++++--------- 10 files changed, 414 insertions(+), 113 deletions(-) create mode 100644 figs/gradient_test_8.png create mode 100644 tests/test_gradient.py diff --git a/.gitignore b/.gitignore index fb8a33c..1848bfd 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,5 @@ cython_debug/ # Borg *allocation_stats_0.txt *timing_stats_0.txt +*fft_wisdom +tests/*.h5 diff --git a/borg_velocity/likelihood.py b/borg_velocity/likelihood.py index 9835107..bb0f462 100644 --- a/borg_velocity/likelihood.py +++ b/borg_velocity/likelihood.py @@ -95,7 +95,6 @@ class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): # Initialise cosmological parameters cpar = utils.get_cosmopar(self.ini_file) self.fwd.setCosmoParams(cpar) - # self.fwd_vel.setCosmoParams(cpar) self.fwd_param.setCosmoParams(cpar) self.updateCosmology(cpar) myprint(f"Original cosmological parameters: {self.fwd.getCosmoParams()}") @@ -138,7 +137,6 @@ class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): cpar = state['cosmology'] cpar.omega_q = 1. - cpar.omega_m - cpar.omega_k self.fwd.setCosmoParams(cpar) - # self.fwd_vel.setCosmoParams(cpar) self.fwd_param.setCosmoParams(cpar) @@ -159,14 +157,13 @@ class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): cpar.omega_q = 1. - cpar.omega_m - cpar.omega_k self.fwd.setCosmoParams(cpar) - # self.fwd_vel.setCosmoParams(cpar) self.fwd_param.setCosmoParams(cpar) - # Compute growth rate - cosmology = borg.cosmo.Cosmology(cosmo) - f = cosmology.gplus(self.af) # dD / da - f *= self.af / cosmology.d_plus(self.af) # f = dlnD / dlna - self.f = f + # # Compute growth rate + # cosmology = borg.cosmo.Cosmology(cosmo) + # f = cosmology.gplus(self.af) # dD / da + # f *= self.af / cosmology.d_plus(self.af) # f = dlnD / dlna + # self.f = f def generateMBData(self) -> None: """ @@ -249,9 +246,6 @@ class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): bulk_flow = jnp.array([self.fwd_param.getModelParam('nullforward', 'bulk_flow_x'), self.fwd_param.getModelParam('nullforward', 'bulk_flow_y'), self.fwd_param.getModelParam('nullforward', 'bulk_flow_z')]) - # v = forwards.dens2vel_linear(output_density, self.f, - # self.fwd.getOutputBoxModel().L[0], self.smooth_R) - # v = v + self.bulk_flow.reshape((3, 1, 1, 1)) v = output_velocity + self.bulk_flow.reshape((3, 1, 1, 1)) omega_m = self.fwd.getCosmoParams().omega_m @@ -276,6 +270,7 @@ class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): self.interp_order, self.bias_epsilon ) + # lkl = (output_density**2).sum() if not jnp.isfinite(lkl): lkl = self.bignum @@ -364,7 +359,7 @@ class VelocityBORGLikelihood(borg.likelihood.BaseLikelihood): state["BORG_final_density"][:] = self.delta -@partial(jax.jit, static_argnames=['L_BOX', 'interp_order', 'bias_epsilon']) +# @partial(jax.jit, static_argnames=['L_BOX', 'interp_order', 'bias_epsilon']) def vel2like(cz_obs, v, MB_field, MB_pos, r, r_hMpc, sig_mu, sig_v, omega_m, muA, alpha, L_BOX, X_MIN, interp_order, bias_epsilon): """ Jitted part of dens2like @@ -420,6 +415,13 @@ def vel2like(cz_obs, v, MB_field, MB_pos, r, r_hMpc, sig_mu, sig_v, omega_m, muA lkl_ind = jnp.log(p_cz) - scale / 2 - 0.5 * jnp.log(2 * np.pi * sig_v**2) lkl = - lkl_ind.sum() + # # DELETE THIS + # p_cz = jnp.trapz(p_r / p_r_norm, r, axis=1) + # lkl_ind = jnp.log(p_cz) - 0.5 * jnp.log(2 * np.pi * sig_v**2) + # lkl = - lkl_ind.sum() + # lkl = los_density.sum() + # lkl = (MB_field**2).sum() + return lkl @@ -454,6 +456,7 @@ def build_gravity_model(state: borg.likelihood.MarkovState, box: borg.forward.Bo # Setup forward model chain = borg.forward.ChainForwardModel(box) + chain.addModel(borg.forward.models.HermiticEnforcer(box)) # CLASS transfer function chain @= borg.forward.model_lib.M_PRIMORDIAL_AS(box) @@ -525,7 +528,15 @@ def build_gravity_model(state: borg.likelihood.MarkovState, box: borg.forward.Bo fwd_param.setCosmoParams(cpar) # This is the forward model for velocity - fwd_vel = borg.forward.velocity.LinearModel(box, mod, af) + velmodel_name = config['model']['velocity'] + velmodel = getattr(borg.forward.velocity, velmodel_name) + if velmodel_name == 'LinearModel': + fwd_vel = velmodel(box, mod, af) + elif velmodel_name == 'CICModel': + rsmooth = float(config['model']['rsmooth']) + fwd_vel = velmodel(box, mod, rsmooth) + else: + fwd_vel = velmodel(box, mod) return chain diff --git a/conf/basic_ini.ini b/conf/basic_ini.ini index 3ebe242..10630ae 100644 --- a/conf/basic_ini.ini +++ b/conf/basic_ini.ini @@ -1,9 +1,9 @@ [system] console_output = borg_log VERBOSE_LEVEL = 2 -N0 = 32 -N1 = 32 -N2 = 32 +N0 = 8 +N1 = 8 +N2 = 8 L0 = 500.0 L1 = 500.0 L2 = 500.0 @@ -42,12 +42,14 @@ mixing = 1 [model] gravity = lpt +velocity = CICModel af = 1.0 ai = 0.05 nsteps = 20 smooth_R = 4 bias_epsilon = 1e-7 interp_order = 1 +rsmooth = 1. sig_v = 150. R_lim = none Nint_points = 201 diff --git a/figs/gradient_test_8.png b/figs/gradient_test_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f5ad669045832eddfccf71ed0a41bfe50a2665 GIT binary patch literal 94370 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%0DwdBr?`fKvn7t>x2j)+r} z{8~btpIQ3TWk!;g%eQ_vUd`$Z>J5z*s@8FtV29{@7EZ!#rC25qz%>z}PrkMFT8rlH zOTj~|g#$O0jmUxUD)+FWm}g$PkI(M8Fw7r7S?9+A9{PtSPl{pgNJj@UZ(G1(K(9Vn zK?RLYNoL!;t<~|tH{Bfy53gq@+O;g{_l|!!XjR%!J*Fh7d5tucVq*ma(lmN+XAz?4 zL>Q?ee-jbRTp0TNMzLiAY;I;e>0C>SgGCBnUB@5qc#TTx)Zl|)E?bF6e^<|82nVpV zTr%^dBP%oc%=%tRdRae4!G5Dz5!fI0R;|;v2+b6kiwE8eBV0+94$3}XW`?8ckS1H!bFnJe>&%mL9g4NT^Tam}}7Pl_{a zonA<1Cwq-ZOB$+pl3ksw3YS1F#|XtjuXODhxpEq7VKNbamB@&F3!7wd)yHs* zZ5`p*gssN&o6Fp|n9?#;{$PG^`F%sCo5KL+B0gS>kHv+4xC{mGEM`XDj<3k6CDYQ5 zk>@VEnOwQm*G|X73lyY;dtcIhwt(%HGeLplCj( z-E;A^gBj&WZ9wjgn5(wwy_83G#Wzv?){4w*9m;of_DjD6leX4iyNg^XJ&iER=OHFW zf)@xQ1}?{UWTynl_(_lj!)ZuW6r~rHv3laUJ>x7d2Pjs?P9aPj+5WDyvdqZ`+}#wjrj@kw&Uj5#Wt z0@ttb^*(RXa9O0eMOi;(BcZ$v9(IIcln4TdGxUg%8Ev4aA)?S#=MKmdYqB1s+h5Vr(q%AnliM9LX&@vz%kX)rE$noPpB-Eb)j5fcjQzOy!l%DqdDdFtkwPKw zV})-k%P+{4XW7D%Dxj(ob zqPi{)W9@Du!z(}+9S>8}sfP_GP`3!cX9BWaY{3FLG%k+NlQB{rW=KOzCHgKd3YeOr z0|a<@H(lgZVyRG2jofIj-vRERX}W`osY-HVX-2^sxdQ9l|1a-7W?C>mn%usqo z<6r6Un5o1+Y^`#)@}!7JsneLiW&*;Z;Z`O z5!acXU*w7y#u#nxQrTQ0iS~%_eV7OK1Jr_>o+n4Vf%y!xB{&oBix1TGWltX~{GTc`3YlXK{!WJqYf%7vAtO9K<5s{zq zB;bJWsf4lu$7zlfR98}O%$CI}iyYAAXuC_FLsVzFIr7gAliu-)D3K~YdA03r-q<*j zA{Tg#`q>43j8J;K(-o_7qi9BpBK#vI?%WIx)gyFan&t+XNCbMSePFlDO-y&8% zB!lv+L()n|+%GT~vD}>Ujf|^mLUpD4YQ5Tu4tqe7^_2=sRrrkgyNHuce#01{cH5^{ zYnrUzieB`;o!^Mh>la=Gz-YS~>j%?IeWL{-c;tQTIHY(YjVF~w)P+nO{mQP3( zK3A;r+mwP_dFF?eGaoUh^~xLSx^jiu@N%Ay861sYvEw8{Hq~!KJ#KM4Pt9E0o84xR zFE9~f=2@LE*wctZv(nM*B9EHRc9Y8FLNTh(UZyP5KHb#KdRBm~X7%U6l{t^@wATc@ zwFRAxMYrq>L+rv@0PB*_5{vciD|isuJ%# zlL6^JAF3~K{%+kP2mwGSzd0#94MrPZx>vXt%QMVOYjcf`_ivn>*fK?jgQ?NG-3Sd$ zfdEh#VJK@NKs_Oo`_k`_7OXNz!zMbK3IR|94?(r(k;BM8n`+=Io$ceXh*1rCS;}%c_>L46}J85!(GQ0=AEj_GZ=H`**#TNkR&P> zYqHiB>vTrSBK=_W*qJ*HFXz0Xs6T=e21Ww{+Qh5&imz`=b1E<9|0(#8>9F)XT=;rk zco!<4V|vu*qJ7J#T(To4(cJ)Lds)#pAA20tw{LVFMBY-A&dqH7m9O8MrOH-xi%sJxCHcCss zI9S|Zp8oi2ef47hHGwb6=C>4ceds(_6?d2mxGglmpT;8)mZ4MS%!3S1f%r)hG~fZ7 zAr6BIRkNPy+y4iYhBz=-k?|l%ED|Ve=$T;bpPnZl4_pM-g96vbepRO4c{9?BEHpVT zP2OQ2xV{4@F6q$!D@lt~Bwt~g=kT=U=(w8ApSe?9MkXsVWwVQBuy$EICv=gfy%n0w z+Zq)r0aI*ztn|r)Tv`&g%GpHc1!oJCPDi-f6f4Vx>sy-@4N}7~pi!=SW;*GOL{&Gd zI@4wD%ExBe#i+S04SEs_K8a=e|dOnc=*q%&}S3dH3viS zQliP_cH@DHwNIH|aj#BK=^t~Sj@?)#ykuC>Z#x-i!nQqtT2l+BcFm9^!rrq%>E5-$gf@b$Yf0xk>2GC2JINQTVv#>1ZFFdb&y z7)qLxBGdCg{(`v&fV#x|CPIN-ho0NjK;~rJ&6)f3DkGiPfD>Lupew^|UPY79qLIq= z?%GjtT&#wj2W6B=;@&3lVKjm;F5tdDrSo-HwiB(YM=eSGQMb?Ee>`$|1bpUrZ%~j^ z29*z5*5vI{)5)n~>FQU&x1E!d^U{{>$Oh0N2)V;{ROhJhx|DGLgAnFM(WJoontqQx z8ny6mS8+)sBSl7as$l>ZU{4veP1bFo0S4m=f(p#ZxHvUXcxP_0XsxPiY?iakl@H|c zG5@)%aqInELjN02#bf^vgO~Rm%m?+;mfhUgNKnj3eszIXRSdZL@?UYIp1iscLCV=% z9=@SbEPwZH(km>OL>#*BHah(9-R6O)m}~qN)u9k83yT=lMKkFL6v&v_m*NXFyaH?&&p(br*lEWcRC7B}XOZ z;^&-BD#rM_pQE3H5BgQA1jm(*Y-GI$(H39poev`I*6`D@p_kQMRh_b0EfqB0YBc(_ zT;~`2d#^I0h_SxoT6|qvUW(y3YQ0;scD6_C-P=~TY%ae!Cm}O>7)|l}OX;#;73z3@ ztd6$OSUOO9(#PiIayPcnydd2XeD&)S<+Ts6cLiTD8Ff-U4d`+V(G-e@PR zt2tdc)#2596@mwcXHz{NUQ%aNI;PFC`N@r#n)xCZU|4E8#_a6bIRQ?5JUlTZPJ~ob z{wukP89~9p`deSXLH5@nhb1O2AJoBffsE@d3?|iqT03?U84nDEc|g{ne5|!RJt`jI zn|E1HZrhPWjRAG-35n_!8Fx6lUIGF$u~i(^5lL-Z)QUf82*i zUay-1x(3%^0xD~}AX$WOm%>%&d+Xn>01fXOpovl{cUDIOaf{6-bHB$g7%rV0SnyEx z=J-SNR_2gqsPderXURaqlEYMCX9N5RV1tG397FsHnWzed5Shu@j{zYM*b_+K<6*U* zV%qa`b&gn(UjWmjP%KB-2`d9O@*ijW53mvY53oAH^pLal1^6>?0LUqyIoJxznNC#A z?lOIO6)}Uo(1qc*%b6p;A>CV!44{P&c!#q&28{!ANQa#q_{;uKip_?c07%-|)pY_g z``snLbwMrwOmOQLDggxnIXQ@1y$)@aE-S0cYkPL2?t<`*;h@29B>Q7^xcmwn%UpkM ze8(iHpa@b2nPgkC3}^LV6uH1M0MwxQ4Io_I%$U~uVk ztd*)$+!af$ln{}AkCD*|H(Dys+c>DXA*Qo&uU`Ygi_8VF(5@Tc7S1k*WBnngWA6U%)=mv^XpXG${@ivWJ?;Dx`(9AR*b{a7C)u)_U%Tg( zLGU$Jx@ZO~FH>=av)h7Y^o&X2M!m!i)bbB;?Jp@1D^P#K5r2tIah41W*%7Zo?!S0J zRq?C(MfB9}Ls#p<66qJ8Q;$93(ui(VOT#eCD7#LV&UqDwj-`^PnA48PYAKjW*gkr= zUi#+)sCb3_zEDik!{nsK?(Qr!>PdAuiamlWEI)@hs@huha49XNm|7R1ycNaQ7@J><#AcDph4PWHmLttAZ#wkyT;B|8JQ(m7)SpBD$F$D#-=`fj z2{mLa}1W|9#}z_>6P%QT7)vmdtLGayl`c!Apj77cS5h9!dUMOk7{D|2E=swr>D|)aq-Igr{vsp>`f;kKH z1Mm=iEhy+V-Y-?n^ijb5S zWW+TTstEWf=z;62lS9bXO%<5hI&NlM zYi{SWSj?h~>(3Ii2rw|WjE){_BkyMBhINmkwTM^zo7^T&qxWst<{`5!Vd0)8uXZ_~ zROx4B-NZZNdUw<58)$tZPq|1`p5Jf!v9=v%P@grl-ZISp#r?!QbGB|QOqY(O@AgC% z12@?nX1Tlr^+DITFDG}4Z#;cIx<&A8VYiRr?6(^U6Ad__U_bAz)h!g3B6^mc(f>v; zvEPjNPyQ9u!12f}asrlnhc^uIaR@tO^c_F#iM9@{l)B?Id=8<D%`(7=`WCsrGBr-?i#pAOjURLF=55-7Qt@i}?6-2U7*C|9ql<@NS^00}7z*fKl-J9qg`JJBb$GPZWFf$oKa-J%T>D!Xbdn zf#Ler1@yN`(EL&a>n2XFXRN=Mb}4YS5R>~fVjuyp1^h(l8(P%b`ntHDUV?f;??67Q zNX10OdTF8@jTe#H>V554LcpgZziH_3Mno%d+~+rM^e5$b9nUykzbI*{SYV%3uUFTi z+d1xr;qSJ=tuJ#_dCmZTvAw3#wtRTc8T-tdn{njtZJ4%r$mc1@E>yWt|Nhr8#p0^0 zv&@IB)IR5YxdR=I6Aof9~S_*(xH=QO`u zrGCrhG6{|ErB_T7E!-2(ufdPf5IyR0D8qD06QpC&-DK{Y>Fn;?{I)gw`&kcliiW?h z$ML0++S+ZNH+puX#qo4>R%@47Fbh(ig2!LK5(_%xJwMnf6lP|4mDN5ZWfQ!0H{W3> z^|wQhLllkObqBm0_F--nn`V@0?GZUYv*uHHgxYE%T=5=#`TRO>%5Z)*Lpf6+RwW~Wb<8CURh5XAh(62SKm06c?21SO!>5^qbZy>aO&UvPI4yHqwKKn&$AjwqI-u{wC^r1u~e@+8lDYl@0h_AQ68yC zw3?~Sx80Ze=Cr!>Yj=n^AVBfw=$`1^uu>Xc@&xX)JB}6SmB?yP@f$xhkAzkp^-yd6 zu=lX|u%D$;H$(Mf=E&+yUCG5!fyI(n-Vd^9KF;%0cgFrmO!G9~FroXiW1j2&?v)F_ zGe-e?g?iSZAU%zzMA{^GKhyZ5M8dTPmKr~7F*U=T>|M&(8`&sv2#m4_p`J-Q5AKBkeq28iU3uuP+xpO?$Pq(& zwD&y_Z|8i|uOGDEwvSEp>lZWEhsyEqUhcVe%n=|OmQk-`g#Sb;lUPSBK*8za19$Ku z{LtzpZ|xF#^07+Xpk3Hf|6fl@f-6X`EF2u)knzDVG#Bv+1Ls-{qU|UHKFWM?^1s8f zka#SQ0WQL_fT`#DkO#JkSGXwF@=1H1M~zKv{{6XCN-v+&kq^_l%T3LTl?}QtVvB2E z=9AABe5BjG(BQv28sLt>a^Kk2aX(nrA*fEphMBo0qs!Q+Vc{$)+#Ttr-9tNiLp6<& z@RZgRmD~0c45+ce=mUl-Kf&CUy_&KXZN}WD7Kd{$H?nXK1GL0Wb(&ljaMC&jgl-%v zXDnZy@!C6Uk5BSaC!hBF{vh)q{_U1vL6ZrOyZLX`aP{hbbFQ&^b{loB&%}imkkk!U zSlRV0&qXV?F8+4oFz$C)yI7!@EtM9X(-^K&nYTD5^r<{0ZL2s+k13TEIDQL6L&!NkDY20p5t--ZksR+|A5=T zm+72!qWb+P)YZ8oJ!`WP9qT$O+M_eEPXZJB?d!Hnx6Yx4-Af4B`Hpwnt`usmPh0#w-8%*Y`E&LKp5mqUOD1MCLgD z%kLw+FPZH*c6)|gs03L1d0kLXNc*B*RVNkTG8th|z-e+aeG;_Pek0S*SA#tlAC094 z7+-{x*`CX(TQj^+0D7}Ns7hQqVNMjU?1-{XPEakjn`_J6+%~h-rO%EPMrydPpo02D zXzImfK2^fpSPf6qjgwxz(=Lm*xQ7P)uQ!9vpILeQ^nture%rd1Be6^iIst#Dv_iM5 z<9Iefko*^`P(gdG&BcrB4-X!TT&O*cpi2Abulu^^QiQ` zzKQl+LdHSE;o$k`lu(UpQ??W`t(l3e9D<9zoCSis-)T}bE}pvGNSxRt@)s}k7c>bl zF4WYpJEN;sV^j5c$Z9G7_93o|eEe1SGBdKBYaLRLvk5(FniNkOZ*V1{D@ex^vF2i^ z!H!VJ`5>nu@XnKQ?_I%!xlXyWjACrZB`MaO5_|0KHW}$>ZgiUcD*kHoxnV`LKwc^H zfqM}?k3#)`({(B`{*$342FGmSTw6ZN~NcZd7VnV&dadiZ2|0`87H zn|uE58cws(8Rp@*cSJPJ#lqv) z*L5Z(owem3t9A5043NHNmMB_A zSioObQY_nMJOJyPhzSqKIpL{D_**M+_O|NRB^s^w_Y%s$Y3bAyP7(- zbb;vK<~*$xJhg|{$7kp4lXnBYH3s^Zxb{q2WF)4QZ}@-Bv>J*OY>ri8ASNdDZJ5BP z77k`qxxaMRnGkg|{VA{Ec6JeM>`gpL(POXiJB|-$@{vE>dfvE$8~yd0NG z2^Zfvh+g{+>ydYD!!sT`sQoWx5{hdTt-p=V9ulzf&(ogo%6@3Q*KEYXk|UOrs$6lc z`i~c5+Na2cd`8#FUD1M|SSJd2=keqzu}#B0LQ0-405(s%-UI`_h)@%Pp| zjU{WgI0112HTzX1x(~+g(2HDrmD%xppl`R!VDUzCv+nyY^z-?}>Pku~Lcia1(Yx8% z-{TH&rI(q~1N`voIs0{d?va=TAC~^Obo6})`T1yEr*O)`l&Wp403XMu9PHWrxoqn^ zgLbL2i)=i{!TNZzA4-J=la)T$v~@??MYM4_*&BXff`eZ^*%r(ctfW*hG|;nt|W|$;2L$P+dCD1rI_5>fWv9U7foVSw=Sq-z2#z~eY~1Z{-_@_ zpEp@2glZZcb>>;a40JG?)EuW4sniv%$IjJsy`sNzc1idpji!gFL6ya)d~6#nd*6{E zLWuL#+tR5Y|GefCA6WGC=-1D8{YhEF&qG619*oa=W2xPshns?ny*B&5IC~4ID!cA` z^dJbRgrFjdgrF$hAV>=spn{ZugrpuyQYk@ELP}IX8j%j^Zjq8w;Lu&t(j9kg-uL@{ zzj5z>+&jiS!#8x`InQ~Xz1LoAuDRyilAfmKVdE6%1mQ-;o7_njo?$ao#Rj^}B!n@h zHw8KKZxh#KLvp`;UjMZ=rEEntP`*#T|F^C6b8rP6?XrJQS#wK6?cX65 zpP1eri_F+lu9IIg3ynz=uG;2s&bKrjO$-)Fy6>W>O@B+biA$=pMjtl$ z_8N9mxHp1y=*NowvuMNm30_0vvm??AM!QzKj6d0OiIum$)~WJ5kn8F(%f5P%`E)g* zy-eme%G=4?3ZT*VA?D%r^BZQ|*?DVb{1-y_=}T?Ve#Ro30~zsFL$ zBWzPXvT?ICqkAe}$Ppw0y&ic^49&k!r_>Q6*i16OVEWcOLtbtOwO&#;HVJQieza-5 zeSJaSnaOFi)%l6(Ow3}=OUK(r6MNTlZ`p8IQhdp%6mC4hvCcTu#&`VPhq4FzcipN| zmQeZwBt>2T&!V_*Le5!YOzxItz z?fYH3+K+Y;ma_LG&WwVsbgJN>y^hqm8C%EAdYTqI8WO@?tXEzBlxkma(QHk0E* z%I02--L%lJ-L}2infu?&`)oSr;;4U}bfyYX`I22+JF{YN%ooe zFEXO6qQvFmyi>N0k677-O6EsDuzpg1qO@?ztwo45&yhqdgO{-7kIg%)qTJ(>Hxe{= zb-Y7o+7m)&wm;${2SY|i6WAw-3i2=ZbT-LRdTj!UMVPAAN%cUV)bB3uFVGv?M798l)YX+Cz&lsude&iSnX$z4*y!2X-nzvdkum0Tvw|@ZH`VUOTYk3>3KLM zrMSo|>pd6V=ytU~+?}?3@i%AanR$iEo8%*D7A8A7W5jvoVyEJko{WnT#>eY5{JH*Y z@)ygGjvy&7Un$QY#Nl-!TE+CV=X}4>cGL^Ikd4?GO|_MTXfV(ul1V*v5P(hedF^%~ zq|PE`cpmS$<8&l`Oxgz|+-Wnwu^MWZ`uc2Lo-)a9J#cnWj5LHLtMZrA>RPn2Z}k-$ zC9On!jIDzICpn{x3ZcRa6lWm=KV{%J z+`a7}_@})0`2JiO%U{(YyxsbSM^kHrPb2QHZ`)06);QaG;B8v4Sr=dJHF8f)IC9?P zkDvWL?;n;syv<=8^WvY5mQ}fR{2-RONodfYB;H-Rcj;awwYntWdkkZ zj>}}p$401G$A`Cf=ilRTpFUo=>2k+s&!2Roiy`jiP|k>Fdi^x*)d73hj#pZ+X~nkD zWr|nRn{^J}B;32yGs_tjq)e|;*F&D-Wan2?936o2s-$EALfj}MG4C4);CufFR4%&a zvOxL$27X)}Q$ZT_Mc58l0(a~Y41tZ{IJqE8~0l8h5z1w&J5# zUlUhg>T_$f!|^GX_V-Mm3gQ0omUEELNxMGcaItXs&N0{`I;{XC^p8Ae1?(AF?jap3 z_5;o%m`g&Gpv`*feiSaIw5{7lvj0BE%qM-4l-39?$=98m*Ytbhkak%B{W9 zb=X^NQL~OJ`IiE8IvpF5uxTJ&dR60hnJE&*%TSf_pfjHgy8WAz#1 z9J~a4I!fm_MPL^w>D`VPXf?f`!I?$esmf@&b8oI^o#^K{-Y=3e8lDQ5`Dgf?*1inH zQ=cfkCH!@NOs|B*ku`O#-gzBxzdG${UrxiT>Kv1?^VGk{CCxN=-S!t;Fdd9x?c?9# zEwo6aS2%;D6T3iBgt!i}@ibk_wd(_PI}s--@?aFf zu(qeAGXG8Vpr`M4f}A7fETMmuu8s>~ul&LD8ocWov!5=!Mb{3or|oKv)KeDYx`%{v zz~E$Pt_jAgKX}HIa| zQ@0qM9eJR16cg;K+^3%Yo1dV=Etl5I<(`*USir6Rl3r7xG(;DFcWGS_c4Sioh@rfQefkO8;3)pnX{t>3Z%~nN_jNt2|Ck~N2 zko`d3H$Z__Qd485Ro2k(2Cw!r(2sNeTCfJq6DA=c_3al+HD|TPt@5q}lQwK_-g-(t!(WKaZSvZOc3e3q}Me| zT2EQ`R3I?fel_owo%Q|d^4ag{^%@z*)d`MZZC;126NbN$O*;lzHt50h`89{-OW?4j zZ%6B13fHYG;kqDgG$dRclh$-}l z>7?SMQ*n2qLxO{Q#q!flQ!bv?Pu9X1KEhhsY{5T&fto=b&f}6feiKm z)fu`s!;&>;hVr}pw3HP+ax`kQm*0F=+^nbVE9>YsRWjK5wpD_U$SLMyJ3yWZ3<)vW z5W$?Jr8T#A07c4{XoNKtm?R~lv(jM-&*uLRivcnMz2zJ z2kOAF0+&#XX2R`rn0mt_`nZcI!HL{y#e3o?k@vONl-%n|v@<14BUploQC!?G7^#4p zWx;kYm}{i*{${i~K&mdFq#F-jYJLN=*Rb$#F>Z(cz2DbY!T)~o#epS87l3F`*s#d|y^GEQpl$t*AXk~W4Ic&;GfpWnBnUf@F{xI_LW;cw% zOsemP50uDp^w7{9*~MLDVW|Si1v8y1;6nmxx!t7>d?5Ue!3YQlfYl%yQ0|}0&Wb-9 z#$Y}lo$V-G-`r(pTqXcZHgn9-wZO!hWYuf-%=Fva>BKA?D*L4TwwSYdDq96!Vhm<5 zI7nkrwx)(i#2`Q-jv3By-D3lyOLN#KJ8&}uVsQ;DUr=d8Mz>u$PNYC9k%OtorC!sF ziwq1H5G$#$jRYg4B{9J zEG!LWL&RKle}pIkXJJSd%d}bREy^O;TT1i%j&tKtoPG|kk~|U4aL6Ru#lzQ^BsqKo z0Am!KKGWKOzR0IfpKe7XE$*b0l)S9!sw_a#FlOQlAJ7>@9s;h#8nA$~t0_WRIXK?liI={8`8Ou&hjaY0pKLDL|SwC&*vI{RP2|Xhwyfi@oUzod!puCzP6w14N;#V zSI81MP4+#I|E7#OdrO?m_4uP3%J`DQSwn$J5}pH!R~bxPQf}CEqbj@q6;qy<*VMb3 zlp810Qe~iQh`gb-a9wlB5_%G4!*k@K_jQ+1efoZr$;=>5i`qgUc`~!3; z4qr*3P+kD(8(spZ(BDC?SYrs@|NLZ!0!a$GmGBDl25tVsml7XnK%TM{p~WyX^<|qv5%BYkp%o(}DdEp1o6cd7!=-2`B_rdq8d4Y(=z26Z zZIpX`mj(s|)PDw6jJ&SW<1TzErjuM)NDZ?G;M9Jk)f$XmmG8*Q2ZA$LY%C)$kpk)A>wkaEkLpKp$Zi#h zkrx(TgMlf_@~wp5V-+x=14CmM{#AB|uJ00vBNdut{d*@S9aI&ym6TqA55Rfk7k8uX z0OX0$XdR4-x}0f~pza3$W^j8Ff3axZ=cRz(o>NPW)>{2Unr|DPx8Tc#Oh z9^m*v1##jA$oQVf0QE)m>ZJj^KjV{5#!U^4bKk40=jpye8ykm>Z>{?Sdm|o=(WL zlO1hvdbo~fU`ulNsrBKxKFfcBD)zW7?lvNDST%AK@H?hSe{qxk@~r*m;SXsh!tMy_ z=^+M8Fgq~rw31WTr27oe)JKti50K5QK#s}DQCKBI^Q%-t(TZaHr4?DU$dZB@G%D!o z20xQet+^?9EZmpy0Z8sXmrs)Fa!O2bY3T)65P{;YFl+)uL*yCkSyjd{%#V{gL9P#z;wSnC!Ql1=V84ShZNq zuTP1S@FX+pvVQMo z1B#19M1cngzS=?JAfPfCxTaj~ldH!~&BaaqY|d{B1Zzc0xY0g2f>ALx5hCbdETan& z?upVksl@h2HFSo?q7aXehdSpmm^B(lTlQqv@?HL zA1Ok7lGko@&VdLU5m5PFrs2!?v&W zYGTOYTBiDh6#y?DBJL#SfU7}74Dw&(f*8BouKPiDCZSB36SWHrK^2+d?!@uhFjRf+u z>p3xDDAvJi84B@+c?J3MB6#zpH7%gT!&J%_knzgUl`!kePyaoJTr)v7NeU<{!1a8X zZRp+81%c=tm}t|mu&|sYzyp4%S>O(QNp!N0+uJ2b37|_$?}Z)14Q3fgxBD980LarE zoH#GCu{BOE0ZFrPKEDq+YF@bZ3RMLTes=YKY!k_o%)4$u)k3Ot_1Cj2;~}Q zLDB7nBSpH#)2A#T3Jz8nCn+gMrzdicofWuTC}eOH!@$f+kUI48S2Y{Jpnmy_LWW4} zzOR4_Q9q}%L1S?Qj_4mirAzle*cm$T|69I825Ecfz+S^?o~6{3H}9k z4)R05J^c?&P$qF9z^h5sl>cgP1wHP(Ut)-KM+%&p1?U87y zU_T@?=mASD@@ax*qL5@_myk6-9AodIqv?_V258WSYnKBT2uWp4+96#NyIlwfNUv^l zd%GAuN%D&#!=+0<=G^Q192g7JJD;HV;I>J3_b~488Qe7_LTk41gQYR*=4OQQnIOTv zA2;b;-XPx?7~w#6hCu7UQ0G*Wi!Qp^?!s@-_;OQ(@F`TKp&tc~#|Q}J1^a{WdKCmo ztHoidj*bon7z98CC%o&0a^2YVO64kZBYXR5mv^gI>71cf^bCGiG` zs+XI~KfNL}_yXUubcqne&^(|Fyk=V=GcRROmHr^zzGsi{(j^RU=$1>PA+gu}XFV>I z4tyCuRSpkKF-QK<(NPBCBjDo^&YS_<8#Uw^dncX}GHV^dD=)YC$J5HN|Dr3lz$6zyFjb`wl%a$hdQ06kp`Er+-ff-eI$#X8Osi{~lt3FEoyy~s~P5g!_^B(8~CEKg% z=tSW}8>gn8bl`AbV6+4#Z`HbfWAosCwfzCg8>g;`lR;=`XJ@CwlglXLnnU*M{&UWZ z;8Lbxc)fP7ts*JrHN$5Y3vOyN9nLWDOoW4RY}qc)BoB0KAeG1~guRl!u3MLw=;Wv& zW3Cg?DY=qT)0YW;vkZzs-wDJ_WZ973}|2E;2_0t z+e|8;VeR-3ogF{9==iuF1S`9FTPHCoCJ~rB$ZFJxq~-+_*k*gbAF+$ z!Y@gnW^%$6viLW}uKR{UxU(Y9t7sz!lmeX>9R%rWK47*r2Aeo3Eloy6{z|$Sjv&8Z`ze#$b2{ z$=^*SB?>rRL~N(rD)!ehKEnz4+TC5O>=C2&hh`pSH=Y>6I5W#1Zg}b9+!OWe*w%;p zcP*|MC*Xftn;1gNTBB&p|2nrt|20s38S|unDGB-Z@e?NkBP0Fb0FMxNIS-0?jG!TV z<&hmu6`+Bf#1I9Ud)eptE)#bWO|KO?uVy-(?Ibz8Vm_2Oh>V?Uk^~(YuetL)`UJ?I z8(~emjxb^Zmm+pV;@_jBKY@?M-bYCl3i^jTSjh>Hw1;+E{`c?S%y4bV7cVTIK1-1&4n4?%)Z}!q zU!PCz6tcetPx~wt6=7Aaj=a>#7)YZ)oI!N;*9{aP#WF=0vHrEjBA)AWH3_;hI&a`X z!($TIfSV~i3i|}S(5t~m$R8|n^+2w$^ z7Ff_i9fpTFbLI?Kp4e}+c_p3GG<7Ht^E2x721AB%yx>qQTB+E6iTx#VQAos)hZ(nC zB?byhSoa2SjzZ#j45J4!*wlh%pFP#@$oON;CkFfid1uWcKVsGA(PUkX(uza#w!Hk~fCF4$x z4Hc*AUhn=_kkJG^RTE)wLwWK|ZKwIX!u4KLu`&|IWw-y-aEp)R`oiJfEkJ_apVDc_ zY{x(o1bW2jDJjSE^74#B-oAPB;)#IFI5s_bHow5I)4Si#?`M7bjKZC=y?8kz5$YNF z?~qt(8W~-Va$dfThPsX(y~xhqG*^wI;?nU2iQlV1chI@smv3&mx(Qbvt6T9>ku_-Q z*BAHPzkMAb7mk$50Xee$J4lOEk$bwp8irKrWRp0E9%-&xLE?6~E?}g4cBR`cJShl0 zq|3%BE-r?PD}nMMUDK=U-vB{c5L;>D+XNYytQSlA@NUTC{xhEm8RQsMIG3NVSuvvg8nqiBX{!T3&%#~{gk~izEWWK;Z7x0z5m$@tykxTHI2W}{trz-2 zugg4E%@aL`&&lgcfz@3F7n3H-;c4uEoU132qX89M;DT2{WLN?-?a{n0ooYbKCfjy& zGWGDl@b(R)eWyXXrTY8Z6A1kP02T7<|4AskP(1+3KQ&ANqOT#RxFKRZ^8GEsB9NvJ zcsJ=o4qOQNRo1f+>72f0;GHWd_^wi%IWzIo^G*l$mdzJ))#a>NL8a6&JE^>!%TJRk>nOk6_35$=U(PF7YJiGMy| zhupBW?JE#$3K^Q5FZE;lEs%;tD13NVPmxU`Zi(rp|KUts+3>o5R%tU7Crq52WRT4k z!WXlGa3R-~io+^tYGT)=#{JA%-V$P@4sRly{8$tDUnnjR(Y-h{2K@c?<`V2MeaKp0 z!06gQsWqiHUy6$}nCHMRzxz`DI7Y_o45;_6JzuzhiGhkAgrNm6287r7`8$j@w7{}0 z@}4K8OgW8TzkWq9{fY>55Cj8YaP)?hl+@R{&x4cTfSU!Y2bAT>A##%g>fi~(0Q`>n z&M_^Zxd=I~&AipJC^`z#)&RyrjLmndKt=$!Z+ov= z!Gd6>JEt^zspW0(5z|nThEoe~85!FqmxO1#4Ei>$x`o8>`)UJjv}~_gJmR2mxT`o2 zL75BR5`lV<=(ttsp($KgNbcbBJg~5rY1@>?4raRq5eP_JZ~n}K4_^!82J*HPSMEhr zLZX!g`8bGSHydrxoI7`{=#fQG5ZL>ug&Hft@@pP*adtjQLGgQvXWily24)w2gR&_c zw!I5H$KM_S9MPCwW{_1}jP{0lhSYM|1|A`Pi)&UJyB-x^J46Bj-~J=r7bEKNVZ_Yh z-mzXJnA~F${TTKrvN!GI`~ZzT)gaq7DB zZ97Z<-%}otmJZ1UWIYdeTZ-F&nI#Gun!X56>G8al3?1CB%rtR5@q%R=7QQm4p9Y;f z89i`O>CU2M7!zS-q;kk(XlOVLXCm^c4-60Y0S{P0IMS-XE!|AV1a9bOuy93%F$?}I zm0|B5&6E0vheh!i>Ip$D1vAZ(mP>?=Rj-e7mJC6Crw>BGQ$rOJsF4Ak6UawTz#HP} z?Usao{K(|D9tIf@xH-_Gsu2}1s6SxV!wW8n4~m;XAYcTL$~x$WJ*%UAJ`7K@CO~4} z3%qLN>yT$67;N%GG9B~#$s$sk%FR6uM|Dgi9h;J=LC)h)oq%@vK~v&f^fkx+z4wsK zStWgc4fQ!tS_KWp z*HcqdavRJAxge$=lbLxE$*@4_`5UBu&AK!38X6ifZoqNR@%REk0;xo!_6Dr@voLgu zlJ14_9gFGDuvUkCxXLTxA1~M4G5V?QEGD&d&9~65xKjuEy<;Ge4?7w!Ha3>~$u9&E+W_%xVsf$7_cs?@|Ia*azro2ut1*;p zmgpWpw2#naQqsC4$o_F%q0w+^xBGO&OIL4)7!DXtbCQoq{U#^r{JQbT%zuvRX9F%L z9hfq}C*Y6#FN9empU1L|!H+*H5}|p7hfm1B$=ULeJboZ0r(b!VX(9RBN;fK7+|cLX)Xzf~)|?33SnCS%X7Ltn4)7 zGA3TrJosGxnI|O=^5hJ1s$ak-Ha$F5)%Y4)xkZ_q80C2UzS!C)A9Y!O%8h$MbB7Lb zu?c7iqI?kv4M8rTJrm0TBJvrcxx9?aryC{vg60GiQkxo#74H&&+= z_?w`!j?%4XV}3$VKz*NRZt(I_=rQ|TOExA$3H6Mcoru-_yzV4l6tV7V0GtfIEKnWAJuD>iGygs}h_BK|Ry~Ncg6pIR@ z9wAUJ-Cc=3kTEif2XIPe{_{WCIAMnj6+*ePfBu7VeFSN!H((uj3Vf_@-M*cLRq5P0kP-u9s)8HLr&tP6=hHslbXLm4(>aCsqtyWh@ z$73?%`Vhdi1djOJzfUy$Ftgb$qTU7)el72+ock^bnj`AE`^^fdQ*$$4Kh&UYGA_Q;PRFCu-2Of5<>2lDgt5&02?DUWFW;VK)47c&8Z@h-Fto13gEzvKm%T7XwE<+ z3ZcC(lP>??X(++*JC|)$aY;X$^BmH?6>Dx+q`Qea>=HcZC{Z1yv#}OJg>ClS{`?

9c3Ypj+Gx#=g!jE<6Bv?5<_FuC0FX?k!_$ey@4-4WT;c#tYy27@X8i0)wc_;NyMulaoJ>n=gR$OB1yrG6G-)=cl5T#!-vFqnxv8bRTMqy z%BCes8h6bj>pG$1aNh1;^Wp5A9F$=lx)%D=URP9AeOq6D3*jN|d)1p|bkzHd!r zqB^@Dvfp$U4#)da<))KkQq9Frg15B3LB#i&A8zb2L83d>{l$9YYZjvhM01(G|- zJI`IX=l@h6R$1WQTj_g_kK3S@UbFpg?sNZ=n?QX*9$X+x83Gd^Os&Ei0E`SFjqw@aqJk1L$f=)hop}%rg{TXA@!>)S3^*tF zI5y)FgCTd1BotV)b@vx0o+(C#h91Kdf}zq9WV}p}Osbm33O4B^gdO%($LBR!lgd80 zy|20yxFejGSe&0v1$M1YMGP07X$iyV4S}Jc)j}eGJ^Eq%(BNz#inu`WiZ$Yp8CT2k<9qS_~$o0n1d! z(oLb3m6(wcgVq~?ROa=c4|c;Ch<{DL(EpIc@zndD>mb4b=z_3c?JO!!cJO=7sMr@l zhxON+DzqAYNK7P`zJn)Mx zBSDUcpwLAFriIaF1lV5s?p?p03Bd4|e!cUmKck67_y1#d6Lr$_L*?p8v{5lHa{`mSm#vWtgyg?6Bu;p0H{Tc%{vda zW0hc94_Wss=mYD6!REJzOc-!z#)w3c!J%Xva`Wa*Ce*#L0}Ce~ND0RvX+^%fsB(lt zgz&!T(wl)DfRwLta0u+g1S^?P^20IcW&qTRFkUdffqIY;90Fj<839}`_tw-`{|+I; z0IRJ%WDgD*94h;}GU)To`#PtVK=n%&rmPXd1i%=OkABR21{ac8sEHJ>o<{!8<@?*S zY|zojmrGV-5>4mA$HuC)Odp!PJuJ3mL5VJaYa@{R*8oc=Ffi~HkbBhAe)~@Nnq{pd zb2ygKy=EBBX%(-Aul}shyx=h;(htj>g;P>eAOZiM3Qpfg!ejkTlgf!B3_{b(9D;0z ziE2I+{-Y28|~d1{H5qAw5jHjIb30HRI2MympfmyZ#& zg8>cDPeDO=80LEsNChr`Zbsoh{jPY_?^@S9O+(`Y!lA%`JnRcXYY{58zDYY&`ooQw z9)o<0V}qermZG zONESiPwQ99y2;s$YWVNQ>I1KO!o&@gIxu{PJRcJKTlenO0zmO>4X4h;$Jf5V-W&{y zlb+C~eT)#Y>-K53Tkuq^pi+U^dpL%Dpg5qMn3!k_4}={r#r*N&#VY#^nYYq-Z>4`P zle;y&#wx#juq9NI4V$A4Du@dprH5KcP{Z@M?mNR$c|6?~k8r2Pg#zI{1vEAd9na6& zg4W}=ko+tlUW;pMHBdAGgNh{8;73fc@J8QfXb{y;EGLj(!oGcZ-b%juimdGBLT^=} zLwi7!)=8!7Kol8S%(_Q}6B@8Rg^(TOZv+$yG=Gb#W(duruyU-|CnI>Fp@8rs@NTaI zVo8?m^aDe9;NTgL@zt0F-LABUSw}F>U`31}fmi@AeE~>C+q6}5g@n#woI;Rw#jSXI z*^-`q<;byr07oc$uI^d6!i_{~l%T;0dF2sMZnW;%6HJW04Go&+vDuj!MMXuo?(T;r zbzTKM5j#hHU6fE;wy68;Wlqj--Z$@z8_j%_mFW??p9 zG=3cJufF@~-w^k~$#;`VTg3obh(TMhcefX$z|%QFF^>%tS?5Mo1DSrr^w!`nzzz3M+Sp#}n z4QN$Z42a}33Yz!60m-=Pt}b;EW7rYKJ1Iiuy_W=}&0F@4tnb7U5E3$SbN_mEQ=y}{ zf4_o0b88!bYI^uT(aiI)>#~V9qJmb%I~%Yd1Hn5EeAvDKrAk&-7S+v2wiEiTCYJua z6i%U7T~zR#Ujx?57;u+zi+4R}EVyZIOdLmo1aN|Qq2d;Gp&?C6+YS|7ti*3yLP*Be z${!wB(#Ua(-er{neS7GcYKj@NkEi#{*0X&%Yr_Wz_q#_Vu$@ zdcf6*M_*)6r^uGKn_XGe-jvu=d26ZoV zaspl8!mALXJ#7T3N8r&!_ZcwXQcrX5#Y4-^zXKrJ2b!9!^CPTzJc*sBH%^qO{iiQ| z2~ut#l68#gr10d$L z^;&1i3?f5bpiOCjv<`HuJEX%-l@^N(PuTd^??8MzC7_;uTBWb$pW@sdxn=^_5aXu% za;v5~^=ULPK|O{EF{_S<77Ah-dh3~_Pwp+w%(#WL3N!u%)?~k2Ki|ATQDSchx)^p+ z(ErCMs;hefXg3T*I4MAdJ=JmLhrBSMe|TXe&q^b{R;4~wJMY$rKe)aaVes^No-E8p z)bu!Io!(H<0^^VK(H^J(Putqu9QG3$tb{^qYC1mmI^MBkZVJY9R##@ON=;W--@@r)g3CxXuML|wwhBAp z@PK?{a#pV62->8m7dRex^V!~7SBbvZcnumYae97{fZF%$!%wmT1A8Sc>9dy^m#MzW z`F)4f@!5Di1?m8SRJ5@!J)g0!r&{NF&Hv&|L`|fazomxnbGIfsqgf%p%5B`~Z#C4f zW;%)Sxwt=%oUWQDt~XA{6sM(;04YKe@)KlhkD93W#BA8RbY3J#f-V9v-5xiX@Qp@4~!yOiN zo_qTxwd=E;ZSH@LWnl8^I82;@UN{pdz(Eu4CQ|I42;6Z9~j z*PPw>G<65|Q&(rFKHRoj04@UO8#TRA_$?|bLenByPurQDmm992oIyKFCk3XHVxAoA zt99{Y#ikG%En_067}Ipv!^4!dVQkH-KEZWwRu^UIldaL@V0<~f3_^n=kP591|MaRK z=$0)p%I(}}8;^_t0*asCTb+zL2=1QHWBm&8S*_0Zf-oh71ddG6?0A9JO}31VBbb!j zJQx=qVY0ktsjQ_t$Pw)1a~S8W*woT0+v4S|;N}=W7S=Wa$yzOFoQoFnGFl7S|1P&q z-zwvGxRS_+gH==sMLhC}=tUYvAbt)6K=oq5>@RuIk!fiuf&02f%dVBS_wynHH4*2* zP#NS-!P(c)u1F`tqo+~DXJYt}#M86d>bidl&SM$4u2n}dOhHZf+H7J zQAUR2mNVCr?Wp%*KOA}>B0ye3Fz|TfgTAoztXh z&CNjkc>eP8 z#h^z44WyRefBIy&;Rw?)FNR+cJ%gpgBq1^6$7b)he1`*u8n52KjE_)6>G=QP_2Mib z&aMg6Sf5nEuQd}u#QL3|jg4OlUfiGs;^!CK$vk$ayK(4<8CDLMXymw&thOR7%TWv0 z5q+?m$ksXX{^$uRJ*Xy7lk*T!{Q+5}8z2_sa1iG?m7z8wT${wWwJ;FrXoS)`?SB5G zS!WFiR%c@5&kX!JP?yc4Asastg&p&$FiPlc9bf4cq1_#sjXgt2;gAUDu_(ALc4r%% zNJ&kNZ-fDC0x7+WQ&_&wZ_UFVmYan(|Jm@Yw}As#EdKulV3c(2{B=F>LFhJQAS@`^ zSLbTy_<8p=F5B8X^;ilU2gvyWx1$e?Gea6-&~l2DkR==-Fw*_M2m9n0WL#36EJa>rE!iTkQ905LiP45Uj8gVk@fMP-`ZVh4Dr?^PZY{%3FRX~F#swMC6JRt z98Rd}5Z?vNEVMIaY=TYx)U*l71E7MQ2hiu-Q@<7e9O;V&GMx%*&?+?WU(}ddJT+pL zvU~bAKagplk=HAKVV`3mS+G?FpL8e16g!(%E+^A5sBP0MfcSH0fl@6^Pg55=l5Usf z5ko`t@kd^wECZ3iz$-7$!fEUZuCb^y{S3%a2C#z)A?ZbFEn>=)*w0JL$$7AKdIN3? z0}`oexpJVkse_MbPKbpFdGBz;m1qLY)S4sc>uqjs>OrnpIGqrl_6>~)KpRncyEHd9 z7k9LC60Al1E==pFh0d_n@#5SX9&)s#05fZO#FJhhLMO7(fnNN`tm&W=vW%qDJQrxn zePZ?kczN?Kcl>?bE@cNJUeKyOiUIHz4gY{amKZI{!!_;gn89)47b0vAmYxH8!KdM3o_H+RDY zzgP~H!yHvWqx*j)UIhNSjfhueINrkPGH!fiWIW4t4>;$<@=8c)@%6G!@k$KxJXUiGmV~G6$d8 zkZ)D(>>Dg0xv?>t>>K|6BpwNw{p`xxT3w3-1*-etcBX;4m-Ao}y@?=5;CUhZT{94f zo>p^f4xPGsb+%YfQDL!42uDya6s#VAb}&@Vc-QUcBopsNazi_oN;`rB@R%A%U(8>c z!>EIw&U0XLSUgRbyb~Pyv^^9TrKUl@n9B4TgE^y`*VZ+o@Y*Om6ia{DWGjNThO9Gy zlgQ|;GK1y*>?(D#nhacS2G$?xCsAG496es3${HRu2a2q0a8?47nh!0O)frr4ic)CmJ?z=DXA%4cbxNeI1Pt2<0y$t_r%sPs z4|WTJ5z#F1vth|nK(=9M$J5pqAnf-05`F->#R3fqCCq5yy?NtdCJm-9Fu!SO-{%V4 z`{sKKr}9h$<+brvxBp!D(fy=WzJu-s*24*~U$`TWfpiME^e?Sl-ip;Wd5&!E?DW#_ zrMo2pM{#GULT7%aoKN=lf4I*Pa_oJh**_$`p3CcG4v;6MmrwqbGeThmnlNaJ7*nZx zu&s`uBbXJ+af*b(+u&a?^IP!@D{|XLtRLhrKdd))y9-R_4S+WUr#BbEd=XC!va>pf zZ44noDtu)?`3B{{>{SO)*OsTd5-9XxhYea*ttvp&UK<^hlHsU2)s7D_Ut)6@AF(~Itj>z*>87eudEK8CXrDT_$FCRbA$U7N*hxP~FD9>F+6 z>JA=2wa8KpopEs7q75LvHGZn!x{(9phFS~&-W=iz0N_opL(36HEyg@<%8zTuWl2%t z2{e{_i&l#mb-zJm!h`Lu3dG-mRACf$Ra+gPE81CdycY?-S^Z|kq_Zh=_;5sGXpAl^f{1 z(;|TI-!L~%@8JQC0*Vc|c@P652Ph16SAeDJ`X!;ZRI~8|3`jnGn%qOAq-7u=cx(LC zM@t#QaodDqKxtr1Ie@KGn(S&uv=VJ1SyfM(w2J90=p(s*|NE|>PM3$rjqJDzL*)=T z2-|#8$1zYo;Z>fm6Na#2-^02iIPs1(3x-CM%neIBumUidF{eX>`Ok3~ynge~#6(qV zEBWKckJW(Wv;alPuL4V5sHh)<1vG*e$lv?+)?u_D)HC*^lMFQ}rk73Gf`<@!*OAh;WW&QsrS5|r~nbK3W;-_fBg@S z^Bb(vhuUhIn(sX69EssbvYW|A6vuw2zh!=OA3uC}4fy3nNc?6@LpZgwf6Dm$*lUHB z7n&F2?0UlAW(Vv=MP+68(NX;zvpl)4Xv%o*+wBN`YZ!zqkplTx7^{1-nnh9cUn+jC z8IgW!mQ=z&--0X!-WW-Gn++77fo_Sw4m9ORQnVG=56F(gz{xEZuvcX^PM)wn2fA&< zB#IrnoRCToHs%|v;2+NDq`iNC5>0oYtq)xX+HxI3!%JXu6fSB3L;h&;87u&KfTN13 zM9o5I8kAI7VzI1n<*3&UrxVP6!GI7zg-x)AG3bDXkr#ag&;v||VE_OIhJ>o%1eyPK zQ#4EOeA=lzwFgW*A2o^~YiTYo`!H7bZ0py>H|qjlooGH~LlCM*?7Ds$%TSn!Vds z_Q;MZ(yMcYUM!EcahewZqT?`(ffFH13578JW3D@WLnvedRE!8IQ@GTS4pL{B$%dtL)}nMt z4t@?2J|aZR1B4%Hf$DfCtc%hrJrOf$`^XK-7YE!FMP_V{q8OhzMUqErPC^ zU5~+KEQ=tGw}4HCO~aCbF`fWs++vrWvd;f)iq>;XRA_^|%;bgRDKNR|t*+y66d^pM zpwN=3C*{NLYj%ncC-v(18v>Rl&Xu@3$+ttT?&?3|&{;H|-OX z`*{NjP{|jmBGBkHri#D%hyNFyS65_!nI(}G*d4TBr)D=xrrH{H6$;Xk>?pC&cxJ3o zVPdZjgnY$BzVc8qq`uW%m{=TlW-gfu$Va3y8JWFxQ3oz|fk*Z2$=K}ZuIz^$E|#`wq?>8mfI78D@3{vFm8 z61ag(K}}CXSq>`pO}2w;PRFv+7VCE%-dADV8Dfa;d*y1>)YRBlAhHHfQ$ccr7vu=O zYRcPDh8s`{KtoqE{=rDNWjV4gf`L0CSnQ}Ufwc*09t4QU=ddz4f|6mV!)MJ@Nh&49oJk;8?CU`cMpBJj&D^m)5)u{cdxeeVAVu1tPg8$cVsL z@c5)EMPNy;$4nfXxqpLOL@$0{UZEdSZvj$50P3a#^tA~@wM9r(M!8(KPKemgc|j9s z40udGAZ>oGo>p-8dO4Q#w51q%#TiR|Al=r3WWe04(V59tsjP)-1h@(NbrqiwAER0E zb+9Ic4u_e_B&Tc$Tl|48EBnUqoq7#iujY8y_GqcJ-yCbAZmpI*$05h~W}e*GZ@b*H z6?^M6s6CCI9SZk7IVMZ};1mI)TH}oRc9e!|8EbxKUDh?TS!I)-{ReLXQr<22@&eG6 zGPeeUlhU7wD3<|M6kKI2-#45etZy*nMYK99Q(mrs-7m*$)oh2Iqy2Z=jc|MQH!QC+N$7Fax`ic0Dy86v@6VbF-I!15GDzO-|KvXL z$M5L4jJaQX=nPyO>Hs4%UaMw-F3FPwNOL5kZ2dgli(x!WB{b!rp&CG?Yo+be}k9j28TUfMl$Y8{yh`k#NL)DtOT$w z-LcQPn{AJ{c}xuH#Qz%oqyD1k$d`-z7TPyVpGLKJA|4m;A1qyWXgo;Hy#_iB@+DTQ z^E<~^i=WCA+gTX|ca_(sL|~5SiuGA2I-%A<48_k9uHwrpD|i_6|2zgBxdDzpyeQDg zqh%j&9wC0|G|l&I1C=G65?Yr=j&+q2uib_jE^~&c<-LySb&d;mb*a_d)ieiVWoRr8 zq+}L;pIg~IVw_UuJ<*zxSx8CyvA=|{T*EqG25WHUJ4znFh4{4!i=51SK&oy)_;s6| zJ4dV;EyrvX0Wdl&2|#~H5_r;>!!g^>ahHTDN=)(nqZ{g89*|v|KkL3&Y)w*Zu<$zLdRu#@^qS zcB#4TP(I*UZb<6X|Hax_M@9L)?S5zlBo%2C6cnT-q)`;5V*qIc0i_!h3BjNRkxoIn z!J$*S1c9L&K{}=D-1Ggtao+R3f1I<{S!SCU*bhSH6?1Se9y2rqv12@yZ{>?-E~3~Ki4v%@kia{m6= zC*+;t+v`rXE#v;o2_+aS4^eTXsBPAn)i;)I_ z`@Oq5wuPxB-!(G)*dyz~`G#*rc z0x;GoPft%bsFM}JnieGa$=|*;U9tS~?-H~BNyBpvszQvm1tU4%TO0d`u{L0;3!vxG zt5h;is8V?cM|!~F!8^VD9MQ5~`?}_kZeaU}!ZvPxijg{t#bQ`_%~Fs)9j7901(hX*>N`-fWQJ;8mlpb~TLD9soKEzM^v z>I~zAP*IDItoyO*P(G+|my)`NT)ws?R;C@)t+5Mh)>~y4>R}p&_Tb;QY@1a-0yp%$n+xmjZvG z!i}{UeHklx9uC%wXPc-S4tMN@pl$bnLW0N@JUqNa1AOvVyf2BPZWFZF6%~JM6NK3@ z&ZhE7$6qDbBVgA4fNtZ35*#S-N}I3VV!w6ETPfoKL~)JG!>rlX+3C0_cm~Sw~NmQNF%eQQKhBL>y5vNKa`ng)49jz z9R|%~1w>r;?L5wT#V6vKxHo$}#Y4^fN-0i4#~ z53o5e`WWq1G#C|Dc11$b%oz6Z2e69xYV#Y<K01o!IKKpwGvffljVuZ;a znYT6p<}>eC6!-F@bp-Nk?eLN5+p}7;s6hRWP7aiss~xN|5f@|yu)jBFc6Aag`{HQ< zZi%sY=+BHGwVme?KCU>RywsO1YA___%EDa4B`6Kqmk-*bxcDbnw*xx z<3}5$f9<%2czfola&Rc6tNt;iGr})WQ=4Hb{%1aP*ddJvx1aKnARjfBbwzlzs!Y;&&G{mwSXbi0KP0g~?;X-~>J2+ zCr6yEDB>N3j`BP{?D)EAd2mKh<^xObp%#P?M^RRTv}Qvaf^ub(z|OHRAlXxQ9|VW z=$UMcM|HCoQPQb6pKJKZaHC>uDHqe~n<=#KO+9;;mO%W$jhR*8*V7N4?VU{@RLcC4_803Vuv3 zI=vf;02Ln7{WqUNG+SRRml6L3dUY4kdxMJi$=_E5o?cD}VVvQ^y~%pbeM+^Sk8*X| z(znVF1kHZq%?75*>h6X9qeL)o1k(x4z9nER9J%q340q8fe~eW0f0O|}G5v!v?LluA z0$j1`sZ}IFXXUn%SB4Sp-0oc4*dUGQs8r~qBuT0Sl7zFy0~LlVT#;Tvxc7_&hl^>V zh1GJ>HK8HP@P%-P!pilk@=dCNcnl#b0 z8h=plKwgcME)a?iewaGgdRP6@-4lAEz;1rD){%PzK=PqQ|D_!#)NsZ3a$o^ay2{WB9N_l@LlPLr%Q zuv#cX$KDfa81~So!<3F**G#T9MnF*kqbda5=|7Ps5*|m>pgL*>oJeTA)p$>AT%4s~ z$r0?eWT9P-alkjVw8$|*pUQDbghAu82e|-S2s6NH4bo#Q=-jhAzx|wAxH)(xXPDKX z^(4kzuAU>?3MSJ-p{^{O++$ZqQ5A!Wzyh)Ha&O69Em@gLbXolL0JA$UydYMysOYNd zADtyA(bL3hgK{1OKJsqSPiW*=*t?)^L9AC{uAcqoD+?a#&;(s(kHiGmk>%)ZLeA{v zxYXTT$=gp=kR%DF*QPp5{}|vSZZu_Ii)!a_UVef6R9V;F=L(uE)_-$^)Rj>^gJ`q7 z>>=E+jC%=L;Ex15pjr5Fw7%(oF_5k9fT*b4Q@Z<0iKlo-jRfhrIgb=6mUEpeL7yxR zoMbMD(6VMMC-gyRgi<`b8F4EoGt!KtDtsbLXE!No$cv$H;#61c_|@|>F_Vks(}_Yw z*>R7Ieg&8S|5i3knM{KAP3nUo^=$O;)FJD)gfkjGYA;W57>Y9J76ZB7uUG2wWi2W7 zr>y!)dEwDvR9;FmyKJ&eNjZ-JJ$_VrJhOlL=U==1kG?(qKRP4S>WPO*vYXXxH3}(; zmdOC84|Md)R9bS~8`Wx#rUe z1G`Xc7z0L7JxG_J6PJ%1HlfjSa7e>Huvh5?@RGTji75NC%_rmMy?K7hb%XCY1lc(X zB0F@ku4$<+Z$9x)knkVYteg7Y#&#izv}zEQH=W$i~H7M9dzsv%7Q)DZ72mFvOnw}B!2CWz2%>lm}mqe0+5!?zr}u;muB1U06oS@iAn0SE{0Utw1l0&V zI*7!IDEcy>nOgi|j&9GW>OqXDibvMK*A@Q~H(%_N-Wo?@Pf0h%KMn!9iYgulCFtIo zx(j%S(h=eQaUQjtuU(?q5)mTlOr3*~k(?1;LrL^S<8WPQU*(oR=f0iu=%Hz_ z#zTKj<0npa1{a5Gg(zRestur*x;(v_{{%dp_!>ftue9)5qog?gC>*chEn%k5sdzQ5 zCCHUvG5k&^uLT5Px#`wqs&ldIrs?>JFKFclB8BzU_b_w-j1>X8<{(f12%?RpIjBPC zKQ)On8M)D^$r9gY2UOzuD|?-F55(w^TEn-`_jV#0TbcQ-ZIuLi3)ytXCD$#|sA4>1 zeV6ruw}RauYC~-nkQNa5q~l`W4RDZawo7A|>V~QKU3OplUVak;Z_pL7UwW@`EjT)O zPwR+T>g9xE!eh*l?)ytrr0D36}-H~%O2m&F5@z3dLwpKlq!ki()`ry zzlOs__>=AXv?)X(cmT$M2O#XYKnxXq9v~Ls5>(aE+zcywcDrOpm@ja#1C%h(hxL7m zvbd7yb@oatH)G-!C%<5OHj#=p-hlU$^vYVC@`21QGZpLVE=p;XQh}@ns)!z~sr^#L z`v-HT%^h{?H}ta?akVHn*lu2@_cFU8LXQljSsTv$kX(s+o{d96VMK?Ohi2AUHxEz5@*>rgS7X`sD2q`r^Y8bkf0ecW`VK*~~h)7MTAm-u|XH(Y-*|7=O}<(6LQF0^KvFx{IOX zu8x(F!tETm9={Qhd_v0qY1zb{)#g+FO`Or+4Wb$hJ{wS9n*-{~&p=#b#`HV7@2H|b zlBHM%K;&r(sJ!isqZ;qT3)visEv6%c**JG%qXcR*M%}C)rd4&+1y2=lF$8(th3P?6 zcj#~KZuJr0@KfgtpXVBv3v_2n!?A*)rq`?I74;oe4|s6%*uZbeUDY)4)YMlD@ZeY}Ulj7i>nfF2vYalI?xcc5WGtplMKt9zhU7Kw zrU!R;4>}sNVxS<^wqjh>+t{TOj%D3_%Df=yJgh1 z$spuo3f}!oh6+w(B?pmAi8lv4Fuh(2Z^x){p`;^q1hK5iM3KXS{))wbaE>#yjn=S! z5pM21RI#2og6*|xC+KRhH2vg@fjnW=;)v|Fy!Fiu!rTgpw8}K{4pywtz1l6eQa76 zIITemc@99-{HL;2ERiw<1f#IJky=wLdUaUVt>B#eXAdbq_kGprvS5uKSClj>r4=K= zUEFD#PNbF}o8SpK<&~hFd(Ca=FM`@|PQ7v-AQ0_aGv!F+Te!#O8Gli+e`4BrvZf{u zJ?S)$edAP)&SV`{N-|)L$DdGue&}24qdfVqcS*YW)b*#Z#&4*5G~CFfQl7l`IV%#o z`)D=q;MhncN2lwN>^nR;whkYhD-d9Ykz#=2$Lbtabx-X`TSK2i0~<96bEB#@pcw}; z6}Zau*X9BqeZ@FC{(n*6zYlv*#u(q`C$9+amli+~^CGBx8RWxugF7${7|3En4Mrap zRb+?^J4&PODs@h|&{Qq0F1N&f!Mfz0J&}+_a#8J?CW8-Vyew02+_c|oLV3WS&ujsx z{Fq3#c*~nH%d>s#B|XYXRqs5-DY1sR&+&s;!W_2cL#O0AT-##@D)iBA>7zzG(Q8>$ z$~G?vJ8~bHXcw>gahlmfRsLM_LrsMU0fHnSxwIc(h_=En1pzRWdKv+9^R4qTAsz;S z$RO(SSQ^E#PWKP^a`Z#p^|Z8*-HznaCs~^O(fG1~zT5YhKF7H>;w}eAK54Zvvu~J|iWwDhjN=@?+VO^(``nB4%1wux z>^T+?^wsn*XPPCdp+_qOG84CnI_TD160G~ab-5Y7-PAfrk<$&-Q@jmXa|*Fv@M83} z7|5YFPbB7U3}(!^S(FKR$*E$#%f9q1_)gaa`FgzVKNUYM zezoqy`;_SKzVCR;Eq>n2{Qe~<=sPz%tg*YMoK$5ci`?pU12=ON-%dUfbRIA?Ecj@} z=h=<|3vidE74iOaxym?3i5F6kxp>X83o1mQ5`Coi_OEl+FOBG61r#;XUHBUFG1TSC zo1c*Lwo&=o*h@M?xD8f)4r(0)$2kAzAd|Uq3^tzV)KK&&H`3qbcM|&HZ#u$ zVpI<^Osr=gL*i0v`)0nGq3s%fHs|Sn-MMvV)rJ^G((4PKc1EXsVA8~F!^xmYu!f6l?um%vdkeNg-YY z7gm;`IYms!mEDE8?=ld&8h_8wd-ce>x=29)ktH^+o}F!Je>8q`@i!K=-JeUsr7l8{ zq$nVoj&eQ254vIud{0?$kcXp$eH>L%EMBPxfb^L z4uuKHu!F!InhIG`cp}hy*oO@XEq)sQwJO!=dX9f|{8iR`j&3wJ-WWNg z#dCQi+VPHsHA@)%ztVBeTsi4#wBH(sMrgEdl-L>&EFKQp;rGrQ|j8ZZzkx7N{fx**C|z;DqG_GF_)S0an&gLL8LJ7SNBI`NI*#*8_WX zhz`Ae@B~d2kElLO6&skP|YCi%;aLJ{`)}=XG7z!Q!kv){~tjPt_QXLqrMAgHI%Y}+6GbD7AcXf z3aF2M(h1qWl1C5lckiFlY1{V{ajK<{Dq*%M){_^nhRS)<1G7gQ!!h>g=P$HA5x(8Y ziU0Dgi(Dd3LK_l?m7$(Pj}93n$0iW8f0aHnba3=(>F8jh1>*6QeGT_=ZEgE3YBw7G zm;`lZEJOxB_Y-Xe*u7z&d7%) z<`x3@3*?rcIogh>uieI|m@w=z40jqj%$Oh&jJ~tP1fyg9{P{z;0H$w+$;JSmZ;IFX z8OE3e_QtNgcNk|n5T!Bk*NAD5ZOH2A&;sU3G-Ew3Gq0+z&h@{l=3n-+CHaf_$5@b( z@9zj|o`H6K5WNwG66&Y*9vA?4hYtBw0&(2iu$jk~F4V<-9vgx0ZBo!|2(udN2jF2KYON{4UWV|?nI&WQcZr+Lib zR;&moCI25AUe9MBo@+6h9;<%%a7;5bsU9JTi+Av~x)?w9hr<$Yg>T861Pn4SYzlHZ zq^iY4H~6->BIL#{ckLnLo@cKKxPKP$(tU2*+#`Tz+INc`VmSXEvrzc1W-o*Ob8vW~ zcvkLp4VJ7jUDbpAW#e(|UnTN)TvjDNLdG2L+1}lkQ|0VWm%;=@AbF#EX2AfgHLmTn zK(yQfp0wcWp!tg+>*WEMQCFh)*t&D)rLYUEh^?}#rN@)PJ(PTytC&w!HB_IIxq&3J^x^D~>O>g`yp zDyJL?g^EG^r|SMc6I4i{j9kT0HnXEgslgkR99GXItKD9~)|y_#o*dtI3pe6G4B-tM zkqbV&(=~cJHxt}=O$%6D%GnW63`S}U&3>A@hX}&@Zd#v#Jh*=)R|amRckxUaFFxfj zAyPHa#_@X3Ey7C2A@Ew?lsKO>spEZv(Pr$=DGZe9?>TfbFwhgQnPHs!SO`#@{QwOI zuk$jJG%wUoFHiieh6TgN7f-HM)AE(=#8VMGo$*;e)0xp;CGM+S)O?tMTykK+@fPz-%($|L((h*EXCFaRA{J zw@=T({`2tBBYceYFvmn#Fd%bnw)O?{M!h(i@tRrqX+&)>eyl18=36@I=88$Kvv@Il zu08Ly>ftx)3bH*tRYugKg!UeuOutU22H{zPyHN7`r*%|$g3*-$vup*B17THmhIdt0T9Zd{ z3`Z2JkRY$=E0n^Kx!ZjIDt@xfX>e4b{xJ1OOy)dVeT6`pqcHu++ zgNhV))fG^1j6{0cswL8@OWwaVq@-e9uv3=#6}P%j+tT8q+Wv-$Njhv?dvA|WE38Ty z6Mta-k;|X(6Ss_Wmmd*iYF(OWs~CZrw~#B^Xv2f1Qt!?n9Y⪼e0GUN}qFcMC9dl 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 xE9vtNH2#%;kV)ow#s5B>`Co~V{#" ] @@ -142,16 +142,18 @@ "ncol = 4\n", "nrow = int(np.ceil(len(names) / ncol))\n", "\n", - "fig, axs = plt.subplots(nrow, ncol, figsize=(ncol*4, nrow*3), sharex=True)\n", + "fig, axs = plt.subplots(nrow, ncol, figsize=(ncol*4, nrow*3))\n", "axs = np.atleast_2d(axs)\n", - "for i in range(ncol):\n", - " axs[-1,i].set_xlabel('Step Number')\n", + "# for i in range(ncol):\n", + " # axs[-1,i].set_xlabel('Step Number')\n", "axs = axs.flatten()\n", "for i in range(len(names)):\n", " axs[i].plot(samples[i,:])\n", " axs[i].set_title(names[i])\n", + " axs[i].set_xlabel('Step Number')\n", "for i in range(len(names), len(axs)):\n", - " axs[i].remove()" + " axs[i].remove()\n", + "fig.tight_layout()" ] }, { diff --git a/scripts/run_borg.sh b/scripts/run_borg.sh index e96e3d2..f50e959 100755 --- a/scripts/run_borg.sh +++ b/scripts/run_borg.sh @@ -31,4 +31,4 @@ set -x # Just ICs INI_FILE=/home/bartlett/fsigma8/borg_velocity/conf/basic_ini.ini cp $INI_FILE basic_ini.ini -$BORG INIT basic_ini.ini \ No newline at end of file +$BORG INIT basic_ini.ini diff --git a/tests/allocation_stats_0.txt b/tests/allocation_stats_0.txt index 4d82422..0040403 100644 --- a/tests/allocation_stats_0.txt +++ b/tests/allocation_stats_0.txt @@ -1,20 +1,30 @@ -Memory still allocated at the end: 31.8652 MB +Memory still allocated at the end: 10.0405 MB Statistics per context (name, allocated, freed, peak) ====================== -*none* 76.2188 0.250069 32.2871 -BORG LPT MODEL 505.495 503.727 32.3027 -BORGForwardModel::setup 0.000160217 0 2.23588 -BorgLptModel::BorgLptModel 1.54688 0 2.23581 -LinearModel::getVelocityField 607.75 589.875 33.1465 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 227.906 75.9688 32.5527 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forward_model.cpp]void LibLSS::BORGForwardModel::setupDefault() 0.53125 0 0.688934 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/borg_lpt.cpp]std::shared_ptr build_borg_lpt(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) [with Grid = LibLSS::ClassicCloudInCell; LibLSS::BoxModel = LibLSS::NBoxModel<3>] 0 0 0.157661 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/particle_balancer/balanceinfo.hpp]void LibLSS::BalanceInfo::allocate(LibLSS::MPI_Communication*, size_t) 72.2135 71.961 32.3027 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/primordial_as.cpp]std::shared_ptr build_primordial_as(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 0.078804 7.62939e-06 0.0788498 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/transfer_class.cpp]std::shared_ptr build_class(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 0.078804 7.62939e-06 0.157669 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io/base.hpp]void LibLSS::detail_model::ModelIO::transfer(LibLSS::detail_model::ModelIO&&) [with long unsigned int Nd = 3] 0 222.656 0 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/samplers/core/gridLikelihoodBase.cpp]LibLSS::GridDensityLikelihoodBase::GridDensityLikelihoodBase(LibLSS::MPI_Communication*, const GridSizes&, const GridLengths&) [with int Dims = 3; GridSizes = std::array; GridLengths = std::array] 0.53125 0.515625 2.76713 -[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/python/pyforward.cpp]void do_get_density_final(LibLSS::BORGForwardModel*, pybind11::array) 75.9688 71.5 32.3027 -lpt_ic 75.9688 75.9688 32.5683 +*none* 6.2686 0.141525 10.1813 +BORG LPT MODEL 35.397 35.3694 10.1823 +BORGForwardModel::setup 0.000183105 0 0.039917 +BorgLptModel::BorgLptModel 0.0263672 0 0.0398483 +BorgLptModel::~BorgLptModel 0 0.0315552 0 +CICModel::getVelocityField 18.8408 16.9146 10.1931 +CICModel::getVelocityFieldAlpha 56.3818 50.7437 10.2018 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 25.0391 6.25977 10.1862 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]void LibLSS::ChainForwardModel::trigger_ag() 0.0195312 0.00390625 0.22258 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forward_model.cpp]void LibLSS::BORGForwardModel::setupDefault() 0.00976562 0 0.0134811 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/borg_lpt.cpp]std::shared_ptr build_borg_lpt(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) [with Grid = LibLSS::ClassicCloudInCell; LibLSS::BoxModel = LibLSS::NBoxModel<3>] 0 0 0.00369263 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt_adj.cpp]void LibLSS::BorgLptModel::clearAdjointGradient() [with CIC = LibLSS::ClassicCloudInCell] 0 0.0236664 0 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt_adj.cpp]void LibLSS::BorgLptModel::preallocate() [with CIC = LibLSS::ClassicCloudInCell] 0.0236664 0 0.295334 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/particle_balancer/balanceinfo.hpp]void LibLSS::BalanceInfo::allocate(LibLSS::MPI_Communication*, size_t) 15.0802 15.0684 10.1823 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/primordial_as.cpp]std::shared_ptr build_primordial_as(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 0.00180817 7.62939e-06 0.00187683 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/transfer_class.cpp]std::shared_ptr build_class(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 0.00180817 7.62939e-06 0.00370026 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io/base.hpp]void LibLSS::detail_model::ModelIO::transfer(LibLSS::detail_model::ModelIO&&) [with long unsigned int Nd = 3] 0 23.7539 0 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/velocity/velocity_cic.cpp]virtual void LibLSS::VelocityModel::CICModel::computeAdjointModel(LibLSS::VelocityModel::Base::arrayVelocityField_t) 0.197266 0.189941 0.27655 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/samplers/core/gridLikelihoodBase.cpp]LibLSS::GridDensityLikelihoodBase::GridDensityLikelihoodBase(LibLSS::MPI_Communication*, const GridSizes&, const GridLengths&) [with int Dims = 3; GridSizes = std::array; GridLengths = std::array] 0.00976562 0.00878906 0.0496826 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/tools/mpi/ghost_planes.hpp]void LibLSS::GhostPlanes::setup(LibLSS::MPI_Communication*, PlaneList&&, PlaneSet&&, DimList&&, size_t) [with PlaneList = std::set&; PlaneSet = std::set&; DimList = std::array&; T = std::complex; long unsigned int Nd = 2; size_t = long unsigned int] 7.62939e-06 3.8147e-05 5.34058e-05 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/python/pyforward.cpp]void do_get_adjoint_model(LibLSS::BORGForwardModel*, pybind11::array) 0.00488281 0.00488281 0.227463 +[/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/python/pyforward.cpp]void do_get_density_final(LibLSS::BORGForwardModel*, pybind11::array) 6.25977 5.00781 10.1823 +dispatch_plane_map 7.24792e-05 4.19617e-05 0.000125885 +exchanging nearby planes after projection 2.50635 2.50635 10.1926 +lpt_ic 6.25977 6.25977 10.1872 diff --git a/tests/fft_wisdom b/tests/fft_wisdom index dac75ab..823e36b 100644 --- a/tests/fft_wisdom +++ b/tests/fft_wisdom @@ -1,28 +1,71 @@ (fftw-3.3.10 fftw_wisdom #x3c273403 #x192df114 #x4d08727c #xe98e9b9d - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x21347a5d #x286e0d10 #xabf9ff02 #xccdf80a5) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe7f77f6a #xaf2de8b8 #xad19bc70 #x80305f29) - (fftw_codelet_n1bv_32_avx 0 #x10bdd #x10bdd #x0 #x6d197f20 #xfc9cbd23 #x91ddb367 #x208619cb) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x1f2e97fe #x61895cd8 #x6073a2f5 #x6ada2663) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x84033142 #x81339a41 #xb78a491e #x66362e05) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x0ac209ed #x737616a2 #xc31f0ad8 #x13c3716f) - (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x40ffeb6f #x4d232a35 #x49c61e65 #x4d75fa83) - (fftw_codelet_n1bv_32_avx 0 #x10bdd #x10bdd #x0 #x35d0d312 #x6b498ae1 #x1ddcffdc #x4a1a1998) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xbffceb36 #x5b340e87 #xc2433c88 #x10e155b2) - (fftw_codelet_r2cf_32 2 #x10bdd #x10bdd #x0 #xe5219ff5 #x7cc0cc2f #x9ce07377 #x12d27b02) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xd78cc60c #x6e1210c6 #x5868829d #x70ada990) - (fftw_codelet_r2cf_32 2 #x10bdd #x10bdd #x0 #x68269cfc #xb89b69b3 #x4eaad8fa #x9807c679) - (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x7446ec55 #x3f800a5f #xba25afcf #xc0e9d5c1) - (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x7ec9785e #x02957b55 #xab1017dc #xdcd04ed7) - (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x68900aea #xb640ce9e #xcd3b0e06 #x8170fa63) - (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x404fdd72 #x2323d034 #xc860c577 #x4779492a) - (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x3c2e2a1a #x07c08954 #x35c337d9 #x80864862) - (fftw_codelet_n1fv_32_sse2 0 #x10bdd #x10bdd #x0 #xe61c7c8d #x2cea019e #x8489a633 #x8d6543c6) - (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x962543ac #xb000f636 #xb27fc586 #xd4a83bb7) - (fftw_codelet_n1fv_32_avx 0 #x10bdd #x10bdd #x0 #x94cb38f8 #xed5987e0 #xa3d4151a #xeb412d04) - (fftw_codelet_r2cb_32 2 #x10bdd #x10bdd #x0 #x92bf92d5 #xdc456f1e #x5a32a424 #xe1f76e14) - (fftw_codelet_n1fv_32_avx 0 #x10bdd #x10bdd #x0 #xb5d7d23e #x26089494 #x55133ef3 #x8ac38174) - (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe0a3b250 #xab7e7c07 #xf0935dde #x1568a95f) - (fftw_codelet_r2cb_32 2 #x10bdd #x10bdd #x0 #x4e6e3714 #xebce55aa #x0ede5253 #x4faf4524) + (fftw_codelet_r2cf_16 2 #x10bdd #x10bdd #x0 #xa7e83312 #x11c3dce9 #x403202b1 #xba9376e9) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe2b7638c #xca3eaae0 #xe5990134 #x15b362bd) (fftw_codelet_n1bv_32_sse2 0 #x10bdd #x10bdd #x0 #x902cd310 #xa659999d #x6fde2637 #xb23e4fd2) + (fftw_codelet_n1bv_16_sse2 0 #x10bdd #x10bdd #x0 #x9306ed57 #x98c44e85 #x5cdf298e #xbcec4b1f) + (fftw_codelet_n1bv_8_sse2 0 #x10bdd #x10bdd #x0 #xa80dd5c4 #x9fd5b8d4 #x3d6788bf #x5a24b1fc) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x40741233 #x3efc06b3 #x0f24264f #x64099f05) (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x4b54e3ca #x4f94ebf3 #x244f4da3 #x2412ca79) + (fftw_codelet_n1fv_32_avx 0 #x10bdd #x10bdd #x0 #x94cb38f8 #xed5987e0 #xa3d4151a #xeb412d04) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x84033142 #x81339a41 #xb78a491e #x66362e05) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xcaf756bf #x6e71602c #x20e86581 #x110e9e90) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x3ca106a5 #xda967bc9 #xbb014751 #x74e4e6ae) + (fftw_codelet_n1fv_32_sse2 0 #x10bdd #x10bdd #x0 #xe61c7c8d #x2cea019e #x8489a633 #x8d6543c6) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x2e35848a #x0ae8a985 #xadfbead1 #xe429563d) + (fftw_codelet_r2cf_32 2 #x10bdd #x10bdd #x0 #xe5219ff5 #x7cc0cc2f #x9ce07377 #x12d27b02) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x6b14be63 #x1d99ab98 #xe3227f85 #xb1db4db0) + (fftw_codelet_n1fv_16_sse2 0 #x10bdd #x10bdd #x0 #xf8443ec2 #xfa3955a3 #xa7e19627 #xab87bd57) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xa3839252 #xea4efad1 #xaf8b0cda #xd8776397) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xa7f53555 #x21d66b4e #x9964caab #xd7909594) + (fftw_codelet_r2cf_8 2 #x10bdd #x10bdd #x0 #x27bdc5f1 #x0e0fc54e #x15095bf2 #x0e78cf6f) + (fftw_codelet_r2cf_16 2 #x10bdd #x10bdd #x0 #xc41f6ea8 #x979a9054 #x4af7b3f3 #xcbc1bd6e) + (fftw_codelet_n1bv_32_avx 0 #x10bdd #x10bdd #x0 #x6d197f20 #xfc9cbd23 #x91ddb367 #x208619cb) + (fftw_codelet_r2cf_32 2 #x10bdd #x10bdd #x0 #x68269cfc #xb89b69b3 #x4eaad8fa #x9807c679) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x8de57ca6 #x4d942122 #xcc9f63a3 #xda26628d) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x4cae513c #xd64a8afb #x187c71d1 #xb541a5b8) + (fftw_codelet_n1fv_32_avx 0 #x10bdd #x10bdd #x0 #xb5d7d23e #x26089494 #x55133ef3 #x8ac38174) + (fftw_codelet_n1fv_8_sse2 0 #x10bdd #x10bdd #x0 #x7035d47e #x31f840f3 #x9383f4ab #x075b88bb) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x7446ec55 #x3f800a5f #xba25afcf #xc0e9d5c1) + (fftw_codelet_n1bv_16_sse2 0 #x10bdd #x10bdd #x0 #xd9d77a34 #x2764630e #xaa589a35 #xc9be81db) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe7f77f6a #xaf2de8b8 #xad19bc70 #x80305f29) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x37e6a727 #xc85b1b7c #x65d78a7d #xf0595850) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x962543ac #xb000f636 #xb27fc586 #xd4a83bb7) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x68900aea #xb640ce9e #xcd3b0e06 #x8170fa63) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x0ac209ed #x737616a2 #xc31f0ad8 #x13c3716f) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x21347a5d #x286e0d10 #xabf9ff02 #xccdf80a5) + (fftw_codelet_n1bv_16_avx 0 #x10bdd #x10bdd #x0 #x36abc7b8 #x1cd3eb8f #xa4996ada #x1a06c95a) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x855943e1 #x80e0a0ca #xd37ea014 #x23f0deee) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xbffceb36 #x5b340e87 #xc2433c88 #x10e155b2) + (fftw_codelet_n1fv_16_sse2 0 #x10bdd #x10bdd #x0 #x7304fb62 #xa799c05d #xa4bd6105 #x6d7bd16b) + (fftw_codelet_n1fv_8_sse2 0 #x10bdd #x10bdd #x0 #xdbede2d6 #x5032ed11 #x297abbbf #x39122c9f) + (fftw_codelet_r2cb_16 2 #x10bdd #x10bdd #x0 #x5bdedfde #x107be498 #x869a0bfb #x7cc04b4f) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x7ec9785e #x02957b55 #xab1017dc #xdcd04ed7) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x45123427 #x01281369 #xb95432bf #x1feb837a) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x91265544 #x90ab0f94 #x1c6548b3 #xe92ee441) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x99251b68 #x8a372a47 #xa305bb39 #x4df59c76) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x40ffeb6f #x4d232a35 #x49c61e65 #x4d75fa83) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #xe6ba1829 #x368612bb #x2bdab11c #x2fc35e23) + (fftw_dft_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x404fdd72 #x2323d034 #xc860c577 #x4779492a) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #xc3c9e752 #x39b3927b #x7df101ab #x79309943) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x7b0c4ef3 #x2018ef0d #xa437b495 #xaddfa382) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x7e4e30fa #xc1ef6b3d #xbc1076dd #xc79407b9) + (fftw_codelet_r2cb_32 2 #x10bdd #x10bdd #x0 #x4e6e3714 #xebce55aa #x0ede5253 #x4faf4524) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xd78cc60c #x6e1210c6 #x5868829d #x70ada990) + (fftw_codelet_n1bv_8_sse2 0 #x10bdd #x10bdd #x0 #x90888d2b #x6076f166 #x437260f2 #x93ff29c3) + (fftw_codelet_n1bv_16_avx 0 #x10bdd #x10bdd #x0 #xdf3d687a #xe46fb97f #x6ee0e7aa #x945d2abd) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xdd819205 #xc9fe9ea4 #x32ec81f1 #x4bbca283) + (fftw_codelet_n1bv_32_avx 0 #x10bdd #x10bdd #x0 #x35d0d312 #x6b498ae1 #x1ddcffdc #x4a1a1998) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x2d4d9e0b #x4a34f327 #x275f3ae1 #x25641e46) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xe0a3b250 #xab7e7c07 #xf0935dde #x1568a95f) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x9ff9c3f3 #xf143b736 #xce2dc789 #x4d442c4a) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x0f7b58ed #xae4d4f79 #xe2fc8e0f #x211d3490) + (fftw_codelet_r2cb_8 2 #x10bdd #x10bdd #x0 #x51e5f6b8 #x566aac6d #x249913ff #xf363e314) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xa2573247 #x00a395db #xf017dd19 #x1df50dd6) + (fftw_dft_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #x1f2e97fe #x61895cd8 #x6073a2f5 #x6ada2663) + (fftw_rdft2_thr_vrank_geq1_register 0 #x10bdd #x10bdd #x0 #xfae0bb4c #xd2ae28c3 #x4adfa199 #xc55e4e63) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x8954f8e1 #x6c6f7b1c #xd3d53834 #xc9eb25c1) + (fftw_codelet_n1fv_16_avx 0 #x10bdd #x10bdd #x0 #x60ba7657 #xefd487be #x5ac1f2cf #x8eb91f0f) + (fftw_rdft2_rank_geq2_register 0 #x10bdd #x10bdd #x0 #x3c2e2a1a #x07c08954 #x35c337d9 #x80864862) + (fftw_codelet_n1fv_16_avx 0 #x10bdd #x10bdd #x0 #xca718bf8 #x524674ba #x011a6dfe #xfbebca33) + (fftw_codelet_r2cb_32 2 #x10bdd #x10bdd #x0 #x92bf92d5 #xdc456f1e #x5a32a424 #xe1f76e14) ) diff --git a/tests/test_gradient.py b/tests/test_gradient.py new file mode 100644 index 0000000..fd698e1 --- /dev/null +++ b/tests/test_gradient.py @@ -0,0 +1,198 @@ +import aquila_borg as borg +import configparser +import numpy as np +import matplotlib.pyplot as plt +import matplotlib +import itertools +import h5py as h5 +import os +import sys +import contextlib +from tqdm import tqdm + +import borg_velocity.likelihood as likelihood +import borg_velocity.forwards as forwards +import borg_velocity.utils as utils + +run_test = True +# run_test = False +epsilon = 1e-2 + + +# Create a context manager to suppress stdout +@contextlib.contextmanager +def suppress_stdout(): + with open(os.devnull, 'w') as devnull: + old_stdout = sys.stdout + sys.stdout = devnull + try: + yield + finally: + sys.stdout = old_stdout + +def compare_gradients( + ag_lh_auto_real: np.ndarray, + ag_lh_auto_imag: np.ndarray, + ag_lh_num_real: np.ndarray, + ag_lh_num_imag: np.ndarray, + plot_step: int, + filename: str="gradients.png", +) -> None: + """ + Comparison of an autodiff adjoint gradient of the likelihood against a + numerical one evaluated with finite differences. + + Args: + - ag_lh_auto_real (np.ndarray): Real part of the adjoint gradient (autodiff) + - ag_lh_auto_imag (np.ndarray): Imaginary part of the adjoint gradient (autodiff) + - ag_lh_num_real (np.ndarray): Real part of the adjoint gradient (numerical) + - ag_lh_num_imag (np.ndarray): Imaginary part of the adjoint gradient (numerical) + - plot_step (int): How frequently to sample the arrays + - filename (str): Name of the file to save the figure + + """ + # Plot colors + colors = { + "red": "#ba3d3b", + "blue": "#3d5792", + } + + fig, axs = plt.subplots(2, 2, figsize=(10, 7)) + + # Real part + axs[0,0].axhline(0.0, color="black", linestyle=":") + axs[0,0].plot(ag_lh_num_real[::plot_step], c=colors["blue"], label="Finite differences") + axs[0,0].plot(ag_lh_auto_real[::plot_step], "o", c=colors["red"], ms=3, label="Autodiff") + axs[0,0].yaxis.get_major_formatter().set_powerlimits((-2, 2)) + axs[0,0].set_ylabel("Real part") + axs[0,0].legend() + axs[0,1].plot(ag_lh_num_real[::plot_step], + ag_lh_auto_real[::plot_step] - ag_lh_num_real[::plot_step], + "o", + c=colors["red"], + ms=3 + ) + x = axs[0,1].get_xlim() + axs[0,1].axhline(y=0, color='k') + axs[0,1].set_xlabel("Numerical") + axs[0,1].set_ylabel("Autodiff - Numerical (real)") + + # Imaginary part + axs[1,0].axhline(0.0, color="black", linestyle=":") + axs[1,0].plot(ag_lh_num_imag[::plot_step][4:], c=colors["blue"], label="Finite differences") + axs[1,0].plot(ag_lh_auto_imag[::plot_step][4:], "o", c=colors["red"], ms=3, label="Autodiff") + axs[1,0].yaxis.get_major_formatter().set_powerlimits((-2, 2)) + axs[1,0].set_ylabel("Imaginary part") + axs[1,0].set_xlabel("Voxel ID") + axs[1,1].plot(ag_lh_num_imag[::plot_step], + ag_lh_auto_imag[::plot_step] - ag_lh_num_imag[::plot_step], + ".", + c=colors["red"] + ) + x = axs[1,1].get_xlim() + axs[1,1].axhline(y=0, color='k') + axs[1,1].set_xlabel("Numerical") + axs[1,1].set_ylabel("Autodiff - Numerical (imag)") + + fig.suptitle("Adjoint gradient of the likelihood w.r.t. initial conditions") + fig.tight_layout() + fig.subplots_adjust(hspace=0.) + + path = "../figs/" + fig.savefig(path + filename, bbox_inches="tight") + + +ini_file = '../conf/basic_ini.ini' + +# Input box +box_in = borg.forward.BoxModel() +config = configparser.ConfigParser() +config.read(ini_file) +box_in.L = (float(config['system']['L0']), float(config['system']['L1']), float(config['system']['L2'])) +box_in.N = (int(config['system']['N0']), int(config['system']['N1']), int(config['system']['N2'])) +box_in.xmin = (float(config['system']['corner0']), float(config['system']['corner1']), float(config['system']['corner2'])) + +# Setup BORG forward model and likelihood +model = likelihood.build_gravity_model(None, box_in, ini_file=ini_file) +cosmo = utils.get_cosmopar(ini_file) +model.setCosmoParams(cosmo) +fwd_param = forwards.NullForward(box_in) +fwd_vel = likelihood.fwd_vel +mylike = likelihood.VelocityBORGLikelihood(model, fwd_param, fwd_vel, ini_file) + +# Create mock data +state = borg.likelihood.MarkovState() +mylike.initializeLikelihood(state) +mylike.updateCosmology(cosmo) +s_hat = np.fft.rfftn(np.random.randn(*box_in.N)) / box_in.Ntot ** (0.5) +mylike.generateMockData(s_hat, state) + +# Compute density field +# output_density = np.zeros(box_in.N) +# mylike.fwd.forwardModel_v2(s_hat) +# print('SUM START', output_density.sum()) +# mylike.fwd.getDensityFinal(output_density) +# print('SUM NOW', output_density.sum()) +# L = mylike.logLikelihoodComplex(s_hat, None) +# print(L) +# quit() + +# Autodiff +autodiff_gradient = mylike.gradientLikelihoodComplex(s_hat) +print(autodiff_gradient.min(), autodiff_gradient.max(), np.sum(np.isfinite(autodiff_gradient)), np.prod(autodiff_gradient.shape)) + +# Finite differences +if run_test: + s_hat_epsilon = s_hat.copy() + num_gradient = np.zeros(s_hat.shape, dtype=np.complex128) + for i, j, k in tqdm( + itertools.product(*map(range, [box_in.N[0], box_in.N[1], box_in.N[2] // 2 + 1])), + total=box_in.N[0] * box_in.N[1] * (box_in.N[2] // 2 + 1), + mininterval=1, + ): + + # +/- epsilon + s_hat_epsilon[i, j, k] = s_hat[i, j, k] + epsilon + with suppress_stdout(): + L = mylike.logLikelihoodComplex(s_hat_epsilon, None) + s_hat_epsilon[i, j, k] = s_hat[i, j, k] - epsilon + with suppress_stdout(): + L -= mylike.logLikelihoodComplex(s_hat_epsilon, None) + QQ = L / (2.0 * epsilon) + + # +/- i * epsilon + s_hat_epsilon[i, j, k] = s_hat[i, j, k] + 1j * epsilon + with suppress_stdout(): + L = mylike.logLikelihoodComplex(s_hat_epsilon, None) + s_hat_epsilon[i, j, k] = s_hat[i, j, k] - 1j * epsilon + with suppress_stdout(): + L -= mylike.logLikelihoodComplex(s_hat_epsilon, None) + QQ = QQ + L * 1j / (2.0 * epsilon) + + s_hat_epsilon[i, j, k] = s_hat[i, j, k] + num_gradient[i, j, k] = QQ + + + with h5.File(f"gradients_{box_in.N}.h5", mode="w") as ff: + ff["scalars/gradient_array_lh"] = autodiff_gradient + ff["scalars/gradient_array_lh_ref"] = num_gradient + ff["scalars/gradient_array_prior"] = np.zeros_like(autodiff_gradient) + ff["scalars/gradient_array_prior_ref"] = np.zeros_like(autodiff_gradient) + +slice_step = 2 +plot_step = 2 + +with h5.File(f'gradients_{box_in.N}.h5', 'r') as f: + ag_lh_auto_real = f["scalars"]["gradient_array_lh"][::slice_step, :, :].flatten().real + ag_lh_auto_imag = f["scalars"]["gradient_array_lh"][::slice_step, :, :].flatten().imag + ag_lh_num_real = f["scalars"]["gradient_array_lh_ref"][::slice_step, :, :].flatten().real + ag_lh_num_imag = f["scalars"]["gradient_array_lh_ref"][::slice_step, :, :].flatten().imag + + compare_gradients( + ag_lh_auto_real, + ag_lh_auto_imag, + ag_lh_num_real, + ag_lh_num_imag, + plot_step, + f'gradient_test_{box_in.N[0]}.png', + ) diff --git a/tests/timing_stats_0.txt b/tests/timing_stats_0.txt index 58f275e..b7a829b 100644 --- a/tests/timing_stats_0.txt +++ b/tests/timing_stats_0.txt @@ -1,54 +1,87 @@ -ARES version c6de4f62faad20ede0bb40aa3678551dceee637b modules +ARES version 53e8df9fe11c732cda13f7ffc821238622068e57 modules Cumulative timing spent in different context -------------------------------------------- Context, Total time (seconds) - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forward_model.cpp]void LibLSS::ForwardModel::setCosmoParams(const LibLSS::CosmologicalParameters&) 439 128.974 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/borg_lpt.cpp]void LibLSS::BorgLptModel::updateCosmo() [with CIC = LibLSS::ClassicCloudInCell] 87 59.7371 - lightcone computation 83 58.2376 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/cosmo.cpp]void LibLSS::Cosmology::precompute_d_plus() 83 50.8567 - LinearModel::getVelocityField 286 13.1932 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 286 6.19859 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/cosmo.cpp]void LibLSS::Cosmology::precompute_com2a() 83 5.85109 - BORG LPT MODEL 286 5.68871 - BORG forward model 286 5.65939 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::updateCosmo() 87 4.72651 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/class_cosmo.cpp]LibLSS::ClassCosmo::ClassCosmo(const LibLSS::CosmologicalParameters&, unsigned int, double, std::string, unsigned int, const std::map, std::__cxx11::basic_string >&) 83 4.65339 - FFTW_Manager::create_c2r_plan 860 1.08067 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/lpt/borg_fwd_lpt.cpp]void LibLSS::BorgLptModel::getDensityFinal(LibLSS::detail_output::ModelOutput<3>) [with CIC = LibLSS::ClassicCloudInCell] 572 0.636041 - Classic CIC projection 572 0.489137 - lpt_ic 286 0.474278 - FFTW_Manager::create_r2c_plan 289 0.377194 - FFTW_Manager::execute_c2r 1716 0.297204 - FFTW_Manager::destroy_plan 1144 0.0944267 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/class_cosmo.cpp]void LibLSS::ClassCosmo::retrieve_Tk(double) 166 0.0942418 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/class_cosmo.cpp]void LibLSS::ClassCosmo::reinterpolate(const array_ref_1d&, const array_ref_1d&, LibLSS::internal_auto_interp::auto_interpolator&) 498 0.0858865 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/python/pyforward.cpp]void transfer_in(std::shared_ptr >&, T&, U&, bool) [with T = boost::multi_array_ref, 3>; U = pybind11::detail::unchecked_reference, 3>] 286 0.0699093 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/python/pyforward.cpp]void do_get_density_final(LibLSS::BORGForwardModel*, pybind11::array) 286 0.0698282 - FFTW_Manager::execute_r2c 286 0.0460398 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::getDensityFinal(LibLSS::detail_output::ModelOutput<3>) 286 0.0272996 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io.cpp]LibLSS::detail_output::ModelOutputBase::~ModelOutputBase() [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 3432 0.0272375 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/primordial_as.cpp]virtual void LibLSS::ForwardPrimordial_As::updateCosmo() 174 0.0224216 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/particle_balancer/balanceinfo.hpp]void LibLSS::BalanceInfo::allocate(LibLSS::MPI_Communication*, size_t) 286 0.018951 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io.cpp]void LibLSS::detail_output::ModelOutputBase::transfer(LibLSS::detail_output::ModelOutputBase&&) [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 2574 0.0179214 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/primordial_as.cpp]void LibLSS::ForwardPrimordial_As::updatePower() 87 0.0121461 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io/base.hpp]void LibLSS::detail_model::ModelIO::transfer(LibLSS::detail_model::ModelIO&&) [with long unsigned int Nd = 3] 6578 0.00613989 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/primordial_as.cpp]virtual void LibLSS::ForwardPrimordial_As::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 286 0.00534198 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/borg_lpt.cpp]std::shared_ptr build_borg_lpt(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) [with Grid = LibLSS::ClassicCloudInCell; LibLSS::BoxModel = LibLSS::NBoxModel<3>] 1 0.00492109 - BorgLptModel::BorgLptModel 1 0.00485408 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 286 0.00379283 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/transfer_class.cpp]std::shared_ptr build_class(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 1 0.00279151 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/primordial_as.cpp]std::shared_ptr build_primordial_as(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 1 0.00275793 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io.cpp]void LibLSS::detail_output::ModelOutputBase::close() [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 3432 0.00244201 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forward_model.cpp]void LibLSS::BORGForwardModel::setupDefault() 1 0.00234473 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/samplers/core/gridLikelihoodBase.cpp]LibLSS::GridDensityLikelihoodBase::GridDensityLikelihoodBase(LibLSS::MPI_Communication*, const GridSizes&, const GridLengths&) [with int Dims = 3; GridSizes = std::array; GridLengths = std::array] 1 0.00177276 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io.cpp]void LibLSS::detail_output::ModelOutputBase::setRequestedIO(LibLSS::PreferredIO) [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 1430 0.00117615 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/adapt_generic_bias.cpp]void {anonymous}::bias_registrator() 1 0.00110666 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io.cpp]void LibLSS::detail_input::ModelInputBase::setRequestedIO(LibLSS::PreferredIO) [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 858 0.000657356 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/model_io.cpp]void LibLSS::detail_input::ModelInputBase::needDestroyInput() [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 286 0.00030629 - particle distribution 286 0.000249263 - BORGForwardModel::setup 7 0.000130953 - Initializing peer system 13 4.4624e-05 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::setModelParams(const LibLSS::ModelDictionnary&) 1 1.445e-05 - [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1686906696789/work/libLSS/physics/forward_model.cpp]virtual void LibLSS::ForwardModel::setModelParams(const LibLSS::ModelDictionnary&) 1 3.659e-06 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 1282 34.5484 + BORG LPT MODEL 1282 33.0864 + BORG forward model 1282 32.9949 + CICModel::getVelocityField 1283 9.73471 + CICModel::getVelocityFieldAlpha 3849 7.41442 + FFTW_Manager::create_r2c_plan 5142 2.65586 + FFTW_Manager::create_c2r_plan 5141 2.57818 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forward_model.cpp]void LibLSS::ForwardModel::setCosmoParams(const LibLSS::CosmologicalParameters&) 34 2.20232 + lpt_ic 1282 1.63669 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/borg_lpt.cpp]void LibLSS::BorgLptModel::updateCosmo() [with CIC = LibLSS::ClassicCloudInCell] 5 1.02187 + lightcone computation 1 0.998 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/cosmo.cpp]void LibLSS::Cosmology::precompute_d_plus() 1 0.917015 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/hermitic.hpp]virtual void LibLSS::ForwardHermiticOperation::getDensityFinal(LibLSS::detail_output::ModelOutput<3>) 1282 0.595479 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/tools/hermiticity_fixup.cpp]void LibLSS::Hermiticity_fixer::forward(CArrayRef&) [with T = double; long unsigned int Nd = 3; CArrayRef = boost::multi_array_ref, 3>] 1282 0.535228 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/tools/hermiticity_fixup.cpp]typename std::enable_if<(Dim != 1), void>::type fix_plane(Mgr&, Ghosts&&, CArray&&, size_t*) [with long unsigned int rank = 0; Mgr = LibLSS::FFTW_Manager; Ghosts = LibLSS::Hermiticity_fixer::forward(CArrayRef&)::; CArray = boost::detail::multi_array::multi_array_view, 2>; long unsigned int Dim = 2; typename std::enable_if<(Dim != 1), void>::type = void; size_t = long unsigned int] 2564 0.500125 + FFTW_Manager::execute_c2r 8985 0.339934 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/python/pyforward.cpp]void do_get_density_final(LibLSS::BORGForwardModel*, pybind11::array) 1282 0.232009 + FFTW_Manager::execute_r2c 5142 0.17592 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt.cpp]void LibLSS::BorgLptModel::getDensityFinal(LibLSS::detail_output::ModelOutput<3>) [with CIC = LibLSS::ClassicCloudInCell] 1282 0.171371 + Classic CIC projection 6415 0.161445 + FFTW_Manager::destroy_plan 10282 0.160099 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io.cpp]LibLSS::detail_output::ModelOutputBase::~ModelOutputBase() [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 16683 0.148489 + exchanging nearby planes after projection 5133 0.132258 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io.cpp]void LibLSS::detail_output::ModelOutputBase::transfer(LibLSS::detail_output::ModelOutputBase&&) [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 14113 0.109589 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/particle_balancer/balanceinfo.hpp]void LibLSS::BalanceInfo::allocate(LibLSS::MPI_Communication*, size_t) 2565 0.0855438 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::updateCosmo() 5 0.0786533 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/python/pyforward.cpp]void transfer_in(std::shared_ptr >&, T&, U&, bool) [with T = boost::multi_array_ref, 3>; U = pybind11::detail::unchecked_reference, 3>] 1282 0.0780552 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/class_cosmo.cpp]LibLSS::ClassCosmo::ClassCosmo(const LibLSS::CosmologicalParameters&, unsigned int, double, std::string, unsigned int, const std::map, std::__cxx11::basic_string >&) 1 0.0778988 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/cosmo.cpp]void LibLSS::Cosmology::precompute_com2a() 1 0.0569591 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::getDensityFinal(LibLSS::detail_output::ModelOutput<3>) 1282 0.0554107 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io/base.hpp]void LibLSS::detail_model::ModelIO::transfer(LibLSS::detail_model::ModelIO&&) [with long unsigned int Nd = 3] 37208 0.0357777 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/velocity/velocity_cic.cpp]virtual void LibLSS::VelocityModel::CICModel::computeAdjointModel(LibLSS::VelocityModel::Base::arrayVelocityField_t) 1 0.028122 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::adjointModel_v2(LibLSS::detail_input::ModelInputAdjoint<3>) 1 0.0271402 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]void LibLSS::ChainForwardModel::trigger_ag() 1 0.0271251 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt_adj.cpp]void LibLSS::BorgLptModel::getAdjointModelOutput(LibLSS::detail_output::ModelOutputAdjoint<3>) [with CIC = LibLSS::ClassicCloudInCell] 1 0.0259611 + BORG adjoint model (particles) 1 0.0259384 + LPT-IC adjoint 1 0.0258888 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 1282 0.0198379 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/primordial_as.cpp]virtual void LibLSS::ForwardPrimordial_As::forwardModel_v2(LibLSS::detail_input::ModelInput<3>) 1282 0.0194489 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io.cpp]void LibLSS::detail_output::ModelOutputBase::close() [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 16683 0.0139736 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io.cpp]void LibLSS::detail_output::ModelOutputBase::setRequestedIO(LibLSS::PreferredIO) [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 6415 0.00580403 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io.cpp]void LibLSS::detail_input::ModelInputBase::setRequestedIO(LibLSS::PreferredIO) [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 5132 0.00454889 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/tools/hermiticity_fixup.cpp]LibLSS::Hermiticity_fixer::Hermiticity_fixer(Mgr_p) [with T = double; long unsigned int Nd = 3; Mgr_p = std::shared_ptr >] 1 0.0034003 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/tools/mpi/ghost_planes.hpp]void LibLSS::GhostPlanes::setup(LibLSS::MPI_Communication*, PlaneList&&, PlaneSet&&, DimList&&, size_t) [with PlaneList = std::set&; PlaneSet = std::set&; DimList = std::array&; T = std::complex; long unsigned int Nd = 2; size_t = long unsigned int] 1 0.00338329 + dispatch_plane_map 1 0.00333988 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/borg_lpt.cpp]std::shared_ptr build_borg_lpt(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) [with Grid = LibLSS::ClassicCloudInCell; LibLSS::BoxModel = LibLSS::NBoxModel<3>] 1 0.00264381 + BorgLptModel::BorgLptModel 1 0.00258427 + Classic CIC adjoint-interpolation 18 0.00243702 + ghost synchronize 1282 0.00235298 + particle distribution 2565 0.00232546 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/model_io.cpp]void LibLSS::detail_input::ModelInputBase::needDestroyInput() [with long unsigned int Nd = 3; Super = LibLSS::detail_model::ModelIO<3>] 1282 0.00174796 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/class_cosmo.cpp]void LibLSS::ClassCosmo::retrieve_Tk(double) 2 0.00143746 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/class_cosmo.cpp]void LibLSS::ClassCosmo::reinterpolate(const array_ref_1d&, const array_ref_1d&, LibLSS::internal_auto_interp::auto_interpolator&) 6 0.00127092 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/adapt_generic_bias.cpp]void {anonymous}::bias_registrator() 1 0.00125063 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forward_model.cpp]void LibLSS::BORGForwardModel::setupDefault() 1 0.0010723 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/samplers/core/gridLikelihoodBase.cpp]LibLSS::GridDensityLikelihoodBase::GridDensityLikelihoodBase(LibLSS::MPI_Communication*, const GridSizes&, const GridLengths&) [with int Dims = 3; GridSizes = std::array; GridLengths = std::array] 1 0.000721845 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/primordial_as.cpp]virtual void LibLSS::ForwardPrimordial_As::updateCosmo() 10 0.000559358 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/hermitic.hpp]virtual void LibLSS::ForwardHermiticOperation::getAdjointModelOutput(LibLSS::detail_output::ModelOutputAdjoint<3>) 1 0.000524894 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/tools/hermiticity_fixup.cpp]typename std::enable_if<(Dim != 1), void>::type adjoint_fix_plane(Mgr&, CArray&&, size_t*) [with long unsigned int rank = 0; Mgr = LibLSS::FFTW_Manager; CArray = boost::detail::multi_array::multi_array_view, 2>; long unsigned int Dim = 2; typename std::enable_if<(Dim != 1), void>::type = void; size_t = long unsigned int] 2 0.000443373 + Classic CIC interpolation 3 0.000410194 + BorgLptModel::~BorgLptModel 1 0.00018844 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/python/pyforward.cpp]void do_get_adjoint_model(LibLSS::BORGForwardModel*, pybind11::array) 1 0.000186842 + BORGForwardModel::setup 8 0.000177922 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt_adj.cpp]void LibLSS::BorgLptModel::adjointModelParticles(LibLSS::BORGForwardModelTypes::PhaseArrayRef&, LibLSS::BORGForwardModelTypes::PhaseArrayRef&) [with CIC = LibLSS::ClassicCloudInCell; LibLSS::BORGForwardModelTypes::PhaseArrayRef = boost::multi_array_ref] 1 0.00013868 + BORG adjoint model 1 0.000106633 + Classic CIC adjoint-projection 1 8.2392e-05 + exchanging nearby planes before taking adjoint gradient 6 8.2354e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt_adj.cpp]void LibLSS::BorgLptModel::preallocate() [with CIC = LibLSS::ClassicCloudInCell] 2 7.5163e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/primordial_as.cpp]std::shared_ptr build_primordial_as(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 1 7.2877e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/transfer_class.cpp]std::shared_ptr build_class(std::shared_ptr, const LibLSS::BoxModel&, const LibLSS::PropertyProxy&) 1 7.2711e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/chain_forward_model.cpp]virtual void LibLSS::ChainForwardModel::getAdjointModelOutput(LibLSS::detail_output::ModelOutputAdjoint<3>) 1 6.745e-05 + Initializing peer system 14 6.3955e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/primordial_as.cpp]void LibLSS::ForwardPrimordial_As::updatePower() 5 4.8762e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/python/pyforward.cpp]void transfer_in(std::shared_ptr >&, T&, U&, bool) [with T = boost::multi_array_ref; U = pybind11::detail::unchecked_reference] 1 3.5512e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::setModelParams(const LibLSS::ModelDictionnary&) 1 2e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/transfer_class.cpp]virtual void LibLSS::ForwardClass::adjointModel_v2(LibLSS::detail_input::ModelInputAdjoint<3>) 1 1.5583e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/primordial_as.cpp]virtual void LibLSS::ForwardPrimordial_As::adjointModel_v2(LibLSS::detail_input::ModelInputAdjoint<3>) 1 1.3838e-05 + gather_peer_by_plane 1 1.0897e-05 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forwards/lpt/borg_fwd_lpt_adj.cpp]void LibLSS::BorgLptModel::clearAdjointGradient() [with CIC = LibLSS::ClassicCloudInCell] 1 3.816e-06 + [/build/jenkins/miniconda3/envs/builder/conda-bld/aquila_borg_1717878335917/work/libLSS/physics/forward_model.cpp]virtual void LibLSS::ForwardModel::setModelParams(const LibLSS::ModelDictionnary&) 1 2.816e-06 + distribute_particles_ag 2 1.678e-06