
    Ki                     <   S SK Jr  S SKrS SKJrJrJrJr  S SKJ	r	  S SK
rS SKJr  S SK7  S SK Jr  \ " S S5      5       rS	 rS
 r  S!S jrS rS rS rS rS rS rS rS rS rS rS"S jrS rS#S jrS rS$S jr S r!S%S jr"S%S jr#S%S jr$S%S jr%S%S  jr&g)&    )	dataclassN)Normal	LogNormalExponential
HalfNormal)MultipleIndependent)
BoxUniform)*c                   H    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   Srg)	ThetaLayout   slicesidxcountsn_paramsorder N)__name__
__module____qualname____firstlineno__dict__annotations____static_attributes__r       T/global/cfs/cdirs/lsst/www/DESC_TD_PUBLIC/users/bastienc/kestrel/dustbi_simulator.pyr   r      s    L	ILNKr   r   c                 Z    0 nSnU  H   nX   X   -  n[        X3U-   5      X$'   X5-  nM"     U$ )Nr   )slice)r   r   r   r   distwidths         r   build_theta_layoutr!      sB    F
Cx~-S+.	  Mr   c                    Uu  p#pE/ / / / / / / / / / S.
n/ / / / / / / / / / S.
nSS/n[        U 5       GHD  u  pU
R                  S5      S   nX;   a  M!  SU;   a  UR                  SS5      n X+   R                  nS
W;   a0  SU;  a*  US   R                  U	5        US   R                  U
5        M~  US:X  a*  US   R                  U	5        US   R                  U
5        M  US:X  a*  US   R                  U	5        US   R                  U
5        M  US:X  a+  US   R                  U	5        US   R                  U
5        GM  US:X  a+  US   R                  U	5        US   R                  U
5        GM@  SU;   a+  US   R                  U	5        US   R                  U
5        GMq  SU;   a+  US   R                  U	5        US   R                  U
5        GM  SU;   a+  US   R                  U	5        US   R                  U
5        GM  SU;   a+  US   R                  U	5        US   R                  U
5        GM  SU;   a+  US   R                  U	5        US   R                  U
5        GM5  [        SU S 35        GMG     UR                  5        VVs0 s H  u  pU[        U5      _M     nnnS!S"S#S#S!S!S$S!S#S"S%.
n[        UU5      n[        UUUUUS&9$ ! [         a    [        SU S	35         GNqf = fs  snnf )'N)
gaussdelta
gauss_EVOLexpexp_EVOL	lognormaldouble_gaussianlinearstepwiselogisticSTEPSCATTER_HIGH_r   	Truncated z!I didn't understand how to parse z%; please ensure it's parsed correctlyGaussianEVOLr#   	DistDeltar$   DistGaussian_EVOLr%   DistExponentialr&   DistExponential_EVOLr'   r   r(   Doubler)   Linearr*   Stepwiser+   Logisticr,   zYou have passed z, which I don't recognise            )
r#   r%   r$   r&   r'   r(   r)   r*   r+   r,   )r   r   r   r   r   )	enumeratesplitreplacer   KeyErrorAssertionErrorappenditemslenr!   r   )param_namesdictsfunction_dict
split_dictpriors_dict	corr_dictr   r   params_to_avoidinamebasefuncnamekvr   r   r   s                     r   build_layoutrU   '   sH   8=5M{ C E y)O[)zz(#A&"$<<R0D	l$*33H ("x)?L"'N!!$'$L"'N!!$',,$$Q',&&t,**Ja %L%//
O""1%*$$T*H$##A&+%%d+!!"))!,#$++D1!M  #(O""4(8#
O""1%*$$T*8#
O""1%*$$T* -hZ7PQRs *v %(IIK0KDAaQiKF0 H  1F A  	l>tfDijk	l^ 1s   )KK,K)(K)c
                   ^ ^^^^^	^^^^^^^^^^^^^^^ ^! Uu  mmn
m[        TU5        / SQn[        TR                  5        Vs1 s H  oS   iM	     sn5      n[        [        [        U
R	                  5       5      U-   U-   5      5      nU V^s/ s H!  m[        U4S jU 5       5      (       a  M  TPM#     nnU Vs0 s H9  nU[        R                  " TU   R                  5       [        R                  US9_M;     snm[        R                  " U Vs/ s H  nTU   PM
     snSS9mST;   af  S/n[        R                  " U Vs/ s H  nUR                  U5      PM     sn[        R                  US9mUR                  TS   S   5      m!TS   S	   m S
T;   aH  SS/n[        R                  " U Vs/ s H  nUR                  U5      PM     sn[        R                  US9m[        T5      m[        U5      mT	(       a$  [        U 4S jT R                   5       5      mS	T-  mSUUUUUU U4S jjmUUUUUUU U	UUUUUUU U!4S jmUU4S jnU$ s  snf s  snf s  snf s  snf s  snf s  snf )N)r-   r.   r3   r>   c              3   ,   >#    U  H	  oT;   v   M     g 7fNr   ).0substrcols     r   	<genexpr>)make_batched_simulator.<locals>.<genexpr>   s     ?VS=s   dtypedevicedimr-   MURESr<   r.   mBc              3   b   >#    U  H$  nTR                   U   TR                  U   -  v   M&     g 7frX   )r   r   )rY   dlayouts     r   r\   r]      s(     X-Q6==+fooa.@@-s   ,/c                 6  > [         R                  " UTUS9nSnTR                   GHX  nTR                  U   S:X  a  M  US:X  a  M!  U SS2TR                  U   4   nTR                  U   nUR                  UTR                  U   U5      n[        TR                  U   5       GH  n	TR                  U   U	   n
SU
;   a  U
R                  S5      S   n
SU
;   a  U
R                  S5      S   n
S	nUSS2U	SS24   nU(       a
  X;   a  X:   nOTU
   nUR                  S
:X  a  UR                  S5      nT(       a   [        XR                  UR                  5        UnTR                  U
5      (       a   TR                  TR                  U
5      5      OSn TU
   u  nnnU
T;   US:H  -  (       a  TU   nU(       a  UU:  nSnOUU:  n[         R                  " UTUS9nUSS2U4   nTU
   " UX5      n[         R                  " USS9nUR                  S
:X  a  UR                  S5      nUUSS2U4'   O!TU
   " XU5      n[         R                  " USS9nUR                  S
:X  a  UR                  S5      nUU-  nGM     GM[     U$ ! [         a	    Su  nnn Nf = f)z@Compute importance weights for a single population's parameters.r`   Fr   r$   N_EVOL_EVOL_r/   Tr>   )NNNr:   g        min)torchonesr   r   r   viewranger   rA   ndim	unsqueezeprintshapegetrC   clamp)	theta_popBdevextra_tensorsjoint_weights	high_flagr   
theta_distn_paramrO   rP   theta_ix
batch_sizecorrelationsteptypesplit_param	split_valsplit_tensormaskweightsx_subdensity_subdensityNrM   debug	df_tensorrJ   rh   rK   s                           r   _compute_joint_weights6make_batched_simulator.<locals>._compute_joint_weights   s   

1a4	MMD}}T"a'w"1fmmD&9#9:Jood+G#FMM$,?IJ6==./||D)!,d?::h/2Dt#::h/2D $I$Q1W- T%:%+A!$A66Q;AA%&6&6?
DMMMRVDWDWimmIMM$,?@]aH7A$7G4Hk9 J&8z+AB#,[#9L +y8$)	+i7#jjQsCGafIE"/"5eW"RK"'++ks"CK"''1,&1&;&;A&>'2GAtG$ ,D1!kJG#kk's;G<<1$%//2G(i 0 "@ ?   H7G4Hk9Hs   	JJJc           	        > U R                   S:X  a  U R                  S5      n U R                  S   nU R                  nSnT R                  S   S:  a  U SS2T R
                  S   4   nUR                  UT R                  S   T R                  S   5      n[        T R                  S   5       H5  nT R                  S   U   nUSS2USS24   nUS:X  d  M)  [        TU5      nM7     0 nUb  X8S'   T!(       aJ  U SS2ST"24   n	U SS2T"ST"-  24   n
U SS2T4   R                  S5      nUT" XX(S9-  SU-
  T" XX(S9-  -   nOT" XX(S9nUR                  SS	S
9nUR                  S5      S:H  nSX'   [        R                  " US:H  [        R                  " [!        T5      US9U5      nX-  nS[        R                  " US-  SS9-  nUUT#:  -  n[        R"                  " UT#S	S9nT$U   nST%;   at  ST%;   a  SnOSnU SS2U4   R                  S5      nUSS2SS2T)4   n[        R                  " UT(:  U* S-  US-  5      nUSS2SS2T'4==   UR                  S5      -  ss'   ST%;   ah  SnU SS2U4   R                  SSS5      n[        R$                  " USS9n[        R&                  " USS2SS2T&4   5      U-  nUSS2SS2T&4==   U-  ss'   [!        S5      UU'   T(       a  TR(                  UR                  S5         nT R                  S   S:  ab  U SS2T R
                  S   4   nUR                  UT R                  S   T R                  S   5      nUSS2SSS24   nUR+                  5       US'   U$ U$ )zIFully batched: theta is (B, n_params), returns (B, n_target, n_features).r>   r   Nr$   SIM_betaMUr<   )r|   T)rc   keepdim      ?rj   rb   )num_samplesreplacementr-   r.   ra   gư>rm   nan)rs   rt   rv   r`   r   r   rq   r   rr   r   add_beta_distancesumsqueezero   wheretensorfloatmultinomialrx   
randn_likeilocitem)*thetarz   r{   mutheta_deltarO   rP   r   r|   theta_Atheta_Bfr}   
weight_sumbad_masknormalized_weightsessresampled_idxresult
temp_indexgammaystepscatternoisedftr   r   r   dfr   f_idxrh   mixturen_pop_paramsn_targetoutput_stackrH   scatter_indicesstep_indicesstep_thresholdy_idxs*                             r   _simulate_sub_batch3make_batched_simulator.<locals>._simulate_sub_batch%  s   ::?OOA&EKKNll==!A%6==#9 9:K%**1fmmG.DfooV]F^_K6==12||G,Q/%aAg.:%*9g>B 3 >"$$ A}},-GA|AlN::;Gah))!,A 6w3 ddQ"8S"ffgM 35S^M #&&1d&;
&&q)Q."%[[q%,,uQxPS2TV`a
*7 EII0A51==sX~. ))H$

 m, [ K'

!Z-(2215Eq!U{#A;;q>1E6!8U1WED1a%&$..*<<& #JAzM*//Aq9Gkk't4G$$VAq/,A%BCgME1a()U2) !<x''-//23C}}W%)#Av}}W'=$=>)..q&--2H&//ZaJbc)!Q'2"-"2"2"4JJr   c                    > U R                   S   nUT::  a  T" U 5      $ / n[        SUT5       H+  n[        UT-   U5      nUR                  T" XU 5      5        M-     [        R
                  " USS9$ )z5Process theta_batch in sub-batches to control memory.r   rb   )rv   rr   rn   rE   ro   cat)theta_batchrz   resultsstartendr   	sub_batchs        r   batched_simulator1make_batched_simulator.<locals>.batched_simulator~  sx    a 	>&{331a+Eei'+CNN.{/EFG , yya((r   rX   )validate_orderlistvaluessetkeysanyro   r   to_numpyfloat32stackindexlongrG   r   r   )"rh   r   rH   parameters_to_condition_onrI   dfdatar   r`   r   r   rL   rN   rT   splitsall_colsr[   steps_to_addcr   r   r   r   rM   r   r   rJ   r   r   r   r   rK   r   r   r   s"   ```   ` ``     `   @@@@@@@@@@@@@@@r   make_batched_simulatorr      sM    9>5M:{I;&1O!2!2!45!4AQ4!456F C[--/069<VVWXH  ??? 	x   C 	U\\"S'**,EMM&QQI ;;#=>#=C3#=>BL y||:FG,Q'--a0,G**
 +00F1CA1FG#F+A.K,,:FG,Q'--a0,G**
 	BA6{H X&--XXL E ENV V Vr
) A 6 	? H Hs+   II2I>A II I%4I*c           	          U Vs0 s H7  nU[         R                  " X   R                  5       [         R                  S9_M9     sn$ s  snf )N)r_   )ro   r   r   r   )r   colsr[   s      r   preprocess_input_distributionr     sH     C 	U\\"'**,EMMBB  s   >Ac                     / nUu  p4pVU  HY  nXtR                  5       ;   a2  XG   S   nUS:X  a%  US:X  a  OXG   S   n	UR                  US-   U	-   5        UR                  U5        M[     U$ )Nr   r:   r-   r>   r/   )r   rE   )
list_of_parameter_namesrI   
empty_listrJ   rK   rL   rM   rP   	evol_typerA   s
             r   parameter_generationr     s    J8=5M{'??$$#)!,IJ&6>'-a0E%%d8mE&9:$ ( r   c                 x   U Vs/ s H  o"U ;   d  M
  UPM     nnU(       d  g U Vs/ s H  o R                  U5      PM     nn[        [        [        U 5      [        U5      -
  [        U 5      5      5      nXE:w  a  [	        U SU 35      eU[        X1R                   S9:w  a  [	        U SU 35      eg s  snf s  snf )Nz0 must appear at the end of param_names in order )keyz are not in the correct order )r   r   rr   rG   
ValueErrorsorted)rH   rN   ppresentindicesexpected_indicess         r   validate_stepr     s    )>/Q+-=q/G> .55W  #WG5 E#k"2S\"A3{CSTU"iGGXY
 	

 &&;&;<<i5o5FG
 	
 =! ? 6s   	B2B2B7c                    Uu  p#pESS/n[        X5        [        S[        S[        S[        S[
        S[        S[        S[        S0nU  Vs/ s H  oU;  d  M
  UPM     n	nU	 V
s/ s H	  oX*      PM     nn
U[        U5      :w  a  [        S	UR                   35      eU Vs/ s H  oU;   d  M
  X\   S
:w  d  M  UPM     nnU H2  nSX,   R                  ;  a  [        SU 35      e[        SU S35        M4     gs  snf s  sn
f s  snf )zG
Catchall error trapping function to be called during initialisation. 
r-   r.   r<   r=      r?         zCPlease ensure that the parameters are give in the following order: Noner3   zConflict detected for keys: z6Found that there is a split and correlation entry for z. Continuing.T)r   DistGaussianDistTruncatedGaussianr4   r5   r6   r7   DistDoubleGaussianDistLogisticr   r   r   r   ru   )rH   rI   rJ   rK   rL   rM   rN   order_priorityr   new_listr   
prioritiesrS   	conflictss                 r   r   r     s*    9>5M{y)O+/ 	aq!!aAa	N 'C;a?*B;HC<DEHq!12HJE VJ''^_m_t_t^uvww 'TJqy.Y\V=SJIT)222;I;GHHJ9+Ubcd	   DE Us$   	C9C9$C>!	D.D8Dc                    / nSn[        X5      nU H  nSU;   a  UR                  S5      S   nSnSU;   a  UR                  SS5      n X7   R                  nX(   oU   n
W	 H*  nU(       a  W
 SU 3nOW
 SU 3nUR                  U5        M,     SnM     U$ ! [         a.    US:X  a  Sn
S/n	 NOUS	:X  a  S	n
S
/n	 N\[        SU SW 35         Nof = f)zz
Creates a set of labels for the parameters. Takes in your regular parameter names; outputs latex labels for everything. 
Fr/   r   Tr0   r1   r-   z$\gamma$r.   z$\sigma_{\rm int}$zNo idea what you passed me: z, z Hi  )r   rA   rB   r   rC   ru   rE   )r   rI   
latex_dictrJ   r   r~   params_to_fitrP   	func_namefunc_paramspname_latex_strings                r   unspool_labelsr    s    JI()@HMt::h'*DI$<<B/D	J&,55I$/KT:J% A!&tA3/!&qnl+  	= > '  	Jv~*m	!!454TF"YKHI	Js   
BC/C<CCc                 "   X:  nU) n/ nU Hl  nX   nUR                  [        R                  " XX[        R                  " U5      5      [        R                  " XH[        R                  " U5      5      /5        Mn     [        R                  " USS9$ )z}
Splits the output tensors to return 4 parameters instead of 2; assumes that split_dict always splits on the same parameter.
ra   rb   )extendro   r   
zeros_liker   )	output_distributionr   r   
param_list	mask_highmask_lowoutr   rT   s	            r   split_outputsr    s     )I
H
C"

KKe&6&6q&9:KK	e&6&6q&9:
 	  ;;s##r   c                 v    [        X5      n[        R                  " U  Vs/ s H  o2U   PM	     snSS9nU$ s  snf )Nra   rb   )r   ro   r   )r   r   r  r   r   s        r   preprocess_datar  (  sB    7[)CD)CAQ	)CD	A
 H	 	Es   6c           	         SS K nSS Kn[        [        [        [
        [        [        [        [        S.n[        U S5       nUR                  U5      nS S S 5        WS   R                  S5      US'   US   R                  S5      US'   US   R                  S5      US'   US   nU HC  n[        [        Xg   5      5       H&  nUR                  US   U   U   5      US   U   U'   M(     ME     US	   R!                  5        V	V
s0 s H
  u  pXU
   _M     sn
n	US	'    US
   R                  S5      US
'   SU;   al  US   nUS    HG  n[        [        US   U   5      5       H&  nUR                  US   U   U   5      US   U   U'   M(     MI     UR                  US   5      US'   U$ ! , (       d  f       GN\= fs  sn
n	f ! ["         a     Nf = f)Nr   )r   r6   r   r   r5   r7   r   r4   rrH   r   	Data_FileSimbank_FilePriors	FunctionsModels_ComparisonPopulation_Bmixing_prior)astyamlr   r6   r   r   r5   r7   r   r4   open	safe_loadrA   rr   rG   literal_evalrF   rC   )filenamer  r  FUNCTION_REGISTRYfileraw_yaml_priorsentrynrP   r  pop_bs               r   load_kestrelr)  4  s    %*$0. 4!6	 
h	>>$' 
 '}5;;C@H]$[177<H['7==cBH^ x Gs7>*+A+.+;+;HX<Nu<UVW<X+YHXu%a( ,   (4::<
<OD 		**<
H[
(01D(E(K(KC(P$% !(8_E3uXu567,/,<,<U8_U=STU=V,Wh&q) 8 % !$ 0 0~1F GnOA 
	
  s$    F'F9F? '
F6?
GGc                 t   SSK Jn  SS KnSS KnUR	                  U SSS9nUR
                  UR                  -  US'   UR                  UR                  R                  5      R                  US'   UR	                  USSS9nUR                  UR                  R                  5      R                  US'   [        S5        UR                  UR                  S	:H     nUR                  UR                  S
:     n[        S5        UR                  UR                  S:     nUR                  UR                  S:     nXV4$ )Nr   )Planck18#z\s+)commentsepSIM_EBVr   zOnly loading DES Data
   g      ?zEnsuring only valid log masses.)astropy.cosmologyr+  numpypandasread_csvSIM_AVSIM_RVdistmodzHDr   valueru   locIDSURVEYPROB_SNNV19HOST_LOGMASS)simfilenamedatfilenamer+  nppdr   r   s          r   	load_datarB  g  s   *	[#5	9BIIbii'ByM.44BtH [[%(f  6F##FJJ$5$56<<F4L	
!"ZZ2-.FZZ**c12F	
+,ZZ++a/0F	!#	%B:r   c                    0 nSS K nU GH  nSU;   a  UR                  " X   R                  5      X'   UR                  " X   R                  5      nUR                  " X   R                  5      nX   U-
  U-  X'   Xx/XFS-   '   UR                  " X   R                  5      X'   UR                  " X   R                  5      nUR                  " X   R                  5      nX   U-
  U-  X'   Xx/XFS-   '   OUR                  " X   R                  5      nUR                  " X   R                  5      nX   U-
  U-  X'   Xx/XFS-   '   UR                  " X   R                  5      nUR                  " X   R                  5      nX   U-
  U-  X'   Xx/XFS-   '   U HS  nUR                  " X   R                  5      nUR                  " X   R                  5      nX   U-
  U-  X'   Xx/XFS-   '   MU     GM     XU4$ )Nr   ERR_data_sim)r2  logr   meanstd)	r   r   r   rH   return_dictr@  parammeanvalstdvals	            r   standardise_datarN    s   K+E>FF6=#7#78FMggfm223GffV]112F#]W4f<FM*1):Kg&
 1 12CJggcj//0GffSZ../F*w.6CJ)0(9Kf% ggfm223GffV]112F#]W4f<FM*1):Kg& ggcj//0GffSZ../F*w.6CJ)0(9Kf% !Eggcj//0GffSZ../F*w.6CJ)0(9Kf% !? ,L ##r   c                 r   / n/ n	SS K n
SSKJn  U
R                  US5       nUR                  S5      R                  S   nU" UR                  S5      R                  U5      5      nUR                  S:  a  UR                  SS  OUR                  S   4nUR                  SSU4S U4SS	S
9nUR                  SS/UQ7S /UQ7SS	S
9nSnU" U SSS9 n[        SX5       GH[  n[        XU-
  5      nUR                  U45      R                  U5      nU(       a	  U" U5      nO-[        R                  " U Vs/ s H  nU" U5      PM     sn5      nUR                  5       R                  5       nUR                  5       R                  5       n[        R                  " U5      R                  [!        [        SUR                  5      5      S9) nUR#                  U5        U	R#                  U5        UR%                  UU-   SS9  UR%                  UU-   SS9  UUUUU-   & UUUUU-   & UU-  nUR'                  U5        GM^     S S S 5        S S S 5        [        R(                  " USS9n[        R(                  " U	SS9n	X   nUR                  U 45      nUU4$ s  snf ! , (       d  f       N_= f! , (       d  f       Nh= f)Nr   )tqdmw)r>   ra   r>   r   r   T)rv   maxshaper_   chunksr   zRunning simulationssim)totaldescunitrb   )axis)h5pyrP  Filesamplerv   tors   create_datasetrr   rn   ro   r   cpur2  isnanr   tuplerE   resizeupdater   )n_simn_batchsims_savenamepriors	simulator	inferencer`   batched	theta_totmask_totrY  rP  r   	theta_dim	x_examplex_shapetheta_dsx_dscursorpbarr   
current_bsr   x_batchttheta_npx_npr   theta_validp_valss                                 r   simulate_modelrz    s   IH	=#	&!MM$'--b1	fmmD144V<=	)2!);)//!"%)//RTBUAW##i.I& $ 
 -w-%W%   
 $9F$q%1 %-8
$mmZM:==fE'4G#kk*MA9Q<*MNG&??,224{{}**,G,00U5GLL;Q5R0SS  -%  3!<FZ/a8 8@ 3437VFZ/0*$J'7 2 G1 
'l 		)+Iyyq)H%K]]E8$F7 +N GF1 
'	&s8   B0J(A$J5JC7J>J(J
J%	!J((
J6c                     SSK JnJn  SSKJn  SnSnU n[        U5       HS  nU" [        UUS9u  pWR                  XUS9nUR                  5       nUR                  U5      nUR                  U5      nMU     W$ )Nr   )SNPEsimulate_for_sbi)process_priorr?   i  )num_simulations)proposal)sbi.inferencer|  r}  	sbi.utilsr~  rr   r   append_simulationstrainbuild_posteriorset_default_x)priorr   r|  r}  r~  
num_roundsr  r  roundr   x_simrh  density_estimator	posteriors                 r   
train_spner    s    4'JOHz"'+ 000Q	%OO---.?@	**1- #  r   c                     U S   nU S   nU S   nUR                   S:X  a  UR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nUnUnSnXc-  Xt-  -
  U-   U-   n	U	$ )zS
df_tensor: dict of tensors, each (N,)
SN_beta:   (B, 1) or (B,)
SN_alpha:  scalar
SIM_x1SIM_cSIM_mBr>   r   gB]3@)rs   rt   )
r   SN_betaSN_alphax1r   re   alphabetaM0r   s
             r   r   r     s     
8	B	7	A	8	B ||q##A&	aB	
QA	aBEDB	dh		#b	(BIr   c                     US   o!S   o1S   nU R                  5       nUS   R                  5       oeS   R                  5       ouS   R                  5       nXr-  Xc-  -
  U-   U-   n	US   U	-
  n
U
$ )Nr  r   re   r  r  Mr   )get_samplesrH  )mcmcr   x1_obsc_obsmB_obsnuisancer  r  r  
correctionrd   s              r   add_distancer  6  s    t_F~u4!HF  "Dg->-C-C-EUVY]M_M_Ma$,.3f<JdOj(EMr   c                 N    [        [        [        5       SS9n[        UU UUSS9nU$ )Nr0  )init_strategymax_tree_depthT)warmup_stepsr   
num_chainsdisable_progbar)NUTSdistancinatorinit_to_medianMCMC)
NUM_WARMUPNUM_SAMPLES
NUM_CHAINSnuts_kernel	salt_mcmcs        r   start_distancer  C  s;    $&
K I r   c                    UR                   S   n[        R                  S[        R	                  SS5      5      n[        R                  S[        R	                  SS5      5      n	[        R                  S[        R                  S	S
5      5      n
[        R                  S[        R                  S5      5      n[        R                  SU5         [        R                  S[        R	                  SS5      5      n[        R                  " SU5      n[        R                  S[        R	                  X5      U S9  X-  X-  -
  U
-
  nS[        R                  " [        R                  " S5      5      -  X-  -  n[        R                  " US-  US-  -   US-  -   US-  -   5      nS[        R                  " U5      -  S-   U-   n[        R                  S[        R	                  UU5      US9  S S S 5        g ! , (       d  f       g = f)Nr   r  g?r   r  g       @g      @r  g     5g      1	sigma_intg333333?snelog10_x0g      g      $@x0_obs)obsg      @r<   g      gQE%@cosmo)rv   pyror[  r   r   Uniformr   platero   powrG  r   sqrtlog10)r  x0_errr  x1_errr  c_errdist_modr'  r  r  r  r  r  x0_truer  mag_err	total_errmean_mags                     r   r  r  U  s   qAKKS#!67E;;vt{{345DCeU34AK)=>I	E1	;;z4;;tS+AB))D(+HKK0 	 	  ^dl2Q6
5<<#5666;KLJJwzIqL8619DuaxOP	%++g..7*DGKK)4  	 	" 
		s   DG11
G?c           
      d   Uu  p4pV/ n/ SQnU  GH  n	X;   a  M  SU	;   a  U	R                  S5      S   n	X9   R                  n
SU
;   a  XY   u  p[        XUS9u  pUR                  X/5        X;   a  XI   S   nUS:X  a  UR                  X/5        GOUS:X  ar  XYS-      S   n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9nUR                  U/5        GOSU
;   ap  XY   S   n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9nUR                  U5        GOSU
;   Ga  XY   S   n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9nUR                  U5        X;   a  XI   S   nUS:X  a  UR                  U/5        OuUS:X  ao  XYS-      n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9nUR                  W/5        U
S:X  Gam  XY   u  nnnnnn[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9n UR                  UUUUU /5        X;   a  XI   S   nUS:X  a  UR                  UUUUU /5        OuUS:X  ao  XYS-      n[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9nUR                  W/5        U
S:X  d  GM  XY   u  n!n"n[	        [
        R                  " U!S   /[
        R                  US	9[
        R                  " U!S
   /[
        R                  US	9S9n#[	        [
        R                  " U"S   /[
        R                  US	9[
        R                  " U"S
   /[
        R                  US	9S9n$[	        [
        R                  " US   /[
        R                  US	9[
        R                  " US
   /[
        R                  US	9S9nUR                  U#U$U/5        GM      U$ )zWBuild the list of BoxUniform priors for distribution parameters only (no STEP/SCATTER).)r3   r-   r.   r/   r   r2   rj   r:   r9   rk   r^   r>   lowhighr4   r6   r   r   )	rA   r   TwoDBoxPriorr	  r	   ro   r   r   rE   )%rH   rI   r`   rJ   rK   rL   rM   list_o_priorsrN   rP   r  mu0sigma0mu_priorsigma_priorr   slope0slope_priorprior0delta_priortau0	tau_priormu1sigma1mu2sigma2aneed_positive	mu1_priorsigma1_prior	mu2_priorsigma2_priora_priorL0k0L_priork_priors%                                        r   build_distribution_priorsr  u  s}   8=5M{M1O"t::h'*D!'00	"%+KC$0V$L!H  (!89!'-a0	
*!((()@A(*(g6q9F","\\6!9+U]]SYZ"\\6!9+U]]SYZ#K "((+7I% &q)F$\\6!9+U]]6R\\6!9+U]]6RK
   -)+$Q'D"\\47)5==P\\47)5==PI
   +!'-a0	
*!(()5(*(g6F'"\\6!9+U]]SYZ"\\6!9+U]]SYZF "((+7 ,,9D9J6Cfa"\\3q6(%--O\\3q6(%--OI
 &\\6!9+U]]6R\\6!9+U]]6RL
 #\\3q6(%--O\\3q6(%--OI
 &\\6!9+U]]6R\\6!9+U]]6RL
 !\\1Q4&fM\\1Q4&fMG   )\9lT[!\]!'-a0	
*!(()\9l\c)de(*(g6F'"\\6!9+U]]SYZ"\\6!9+U]]SYZF "((+7&(.NBF \\2a5'vN\\2a5'vNG !\\2a5'vN\\2a5'vNG %\\6!9+U]]6R\\6!9+U]]6RK   '7K!@Ag j r   c           	         Uu    p4n/ nSU ;   ap  US   S   n[        [        R                  " US   /[        R                  US9[        R                  " US   /[        R                  US9S9nUR	                  U/5        SU ;   ap  US   S   n[        [        R                  " US   /[        R                  US9[        R                  " US   /[        R                  US9S9n	UR	                  U	/5        U$ )zGBuild the list of priors for STEP and SCATTER (appended last in theta).r-   r   r^   r>   r  r.   )r	   ro   r   r   r	  )
rH   rI   r`   r  rL   r  step0
step_priorscatter0scatter_priors
             r   build_special_priorsr    s     AqqMF#A&uQxjfMuQxjfM
 	j\*Ky)!,"x{m5==Px{m5==P 	m_-r   c                 n    [        XUS9[        XUS9-   n[        S[        U5       S35        [	        X2S9$ )Nrj   zAdded z priors)r  r  ru   rG   r   )rH   rI   r`   
all_priorss       r   prior_generatorr    s?    *;fM%kHIJ	F3z?#7
+,z99r   c           	      `   [        [        R                  " U S   /[        R                  US9[        R                  " U S   /[        R                  US9S9n[        [        R                  " US   /[        R                  US9[        R                  " US   /[        R                  US9S9nX44$ )z;
General wrapper for any distribution with two parameters.
r   r^   r>   r  )r	   ro   r   r   param_1param_2r`   p1_priorp2_priors        r   r  r    s    
 \\71:,emmFK\\71:,emmFK
H
 \\71:,emmFK\\71:,emmFK
H
 r   c           	         [        [        R                  " U S   [        R                  US9[        R                  " U S   [        R                  US9S9n[	        [        R                  " US   [        R                  US9S9nX44$ )zZ
theta[0] ~ mean value, error on mean value
theta[1] ~ standard deviation of the Gaussian
r   r^   r>   )r:  scale)r  )r   ro   r   r   r   r  s        r   TwoDGaussianPriorr  $  sm     LL5==Hll71:U]]6JH
 ll71:U]]6JH r   )r0  r^  FF)r^  T)g333333?)2      r>   )r^  )'dataclassesr   ro   torch.distributionsr   r   r   r   r  r   r2  r@  r	   r  r   r!   rU   r   r   r   r   r   r  r  r  r)  rB  rN  rz  r  r   r  r  r  r  r  r  r  r  r   r   r   <module>r     s    !  J J )     "
  rx MR#(h`&
.&R(T$$	1f6,$`DND6$"@|~0:$r   