
    %gH                     z   d Z ddlZddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZ ddlmZmZmZmZmZmZ eeej6                  df   Z G d	 d
e      ZdededdfdZdededdfdZ G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d d      Z&y)z
CmdStan arguments
    N)Enumauto)time)AnyDictListMappingOptionalUnion)default_rng)_TMPDIR)cmdstan_pathcmdstan_version_beforecreate_named_text_file
get_loggerread_metricwrite_stan_jsonc                   p    e Zd ZdZ e       Z e       Z e       Z e       Z e       Z	 e       Z
defdZy)MethodzSupported CmdStan method names.returnc                 P    d| j                   j                  d| j                  dS )N<.>)	__class____name__name)selfs    S/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/cmdstanpy/cmdstan_args.py__repr__zMethod.__repr__#   s     NN33TYY??    N)r   
__module____qualname____doc__r   SAMPLEOPTIMIZEGENERATE_QUANTITIESVARIATIONALLAPLACE
PATHFINDERstrr     r!   r   r   r      s>    )VFvH&&KfGJ@# @r!   r   valuer   r   c                     | Bt        | t        t        j                  f      r| dk  rt	        | d      y t	        | d      y )Nr    must be greater than 0z must be of type int)
isinstanceintnpinteger
ValueErrorr-   r   s     r   positive_intr6   '   sT    ec2::./z D6)@!ABB  v%9:;; r!   c                     | Gt        | t        t        t        j                  f      r| dk  rt        | d      y t        | d      y )Nr   r/   z must be of type float)r0   r1   floatr2   floatingr4   r5   s     r   positive_floatr:   0   sV    ec5"++67z D6)@!ABB  v%;<== r!   c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddee   dee   dedee   dee   deee	ee
f   ee   ee	ee
f      df   d	eeee   df   d
edee   dee   dee   dee   dededdfdZdee   ddfdZdedee   dee   fdZy)SamplerArgsz(Arguments for the NUTS adaptive sampler.Niter_warmupiter_samplingsave_warmupthinmax_treedepthmetric	step_sizeadapt_engagedadapt_deltaadapt_init_phaseadapt_metric_windowadapt_step_sizefixed_param
num_chainsr   c                     || _         || _        || _        || _        || _        || _        d| _        d| _        || _        || _	        |	| _
        |
| _        || _        || _        || _        d| _        || _        yInitialize object.N)r=   r>   r?   r@   rA   rB   metric_typemetric_filerC   rD   rE   rF   rG   rH   rI   diagnostic_filerJ   )r   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   s                  r   __init__zSamplerArgs.__init__<   s    ( '*&	**.8<"*& 0#6 .&#$r!   chainsc                 r   t        |t        t        j                  f      r|dk  rt	        d      | j
                  $| j                  | j                  | j                  | j                  du rd}| j
                  dj                  || j
                        }| j                  dj                  || j                        }| j                  dj                  || j                        }| j                  d	j                  || j                        }t	        |      | j                  | j                  d
k  s*t        | j                  t        t        j                  f      s$t	        dj                  | j                              | j                  d
k(  r| j                  rt	        d      | j                  ]| j                  d
k  s*t        | j                  t        t        j                  f      s$t	        dj                  | j                              t        | j                  d       t        | j                  d       | j                   t        | j                   t"        t        t        j                  t        j$                  f      r3| j                   d
k  rt	        dj                  | j                               t'        | j                         |k7  r.t	        dj                  |t'        | j                                     t)        | j                         D ](  \  }}|d
k  st	        dj                  |dz   |             | j*                  t        | j*                  t,              r| j*                  dv r	d| _        n| j*                  dv r	d| _        n| j*                  dv r	d| _        nt0        j2                  j5                  | j*                        s$t	        dj                  | j*                              t7        | j*                        }t'        |      dk(  rd| _        nd| _        | j*                  | _        nt        | j*                  t:              rd| j*                  vrt	        d      t=        t        j>                  | j*                  d         j@                        }t'        |      dk(  rd| _        nd| _        tC        tD        dd      }tG        || j*                         || _        n=t        | j*                  t<        tH        f      rt'        | j*                        |k7  r.t	        dj                  t'        | j*                        |            tK        d  | j*                  D              rg }t)        | j*                        D ]  \  }}|}	d|	vrt	        d!j                  |dz               |d
k(  r,t=        t        j>                  |	d         j@                        }nOt=        t        j>                  |	d         j@                        }
|
k7  rt	        d"j                  |dz   ||
            tC        tD        dd      }tG        ||	       |jM                  |        t'              dk(  rd| _        nd| _        || _        ntK        d# | j*                  D              r(g }t)        | j*                        D ]  \  }}t        |t,              sJ t0        j2                  j5                  |      st	        dj                  |            |d
k(  rt7        |      }nwt7        |      }
t'              t'        |
      k7  r(t	        d$j                  | j*                  d
   |            ||
k7  r(t	        d$j                  | j*                  d
   |            |jM                  |        t'              dk(  rd| _        nd| _        || _        n]t	        d%j                  tO        | j*                  d
                     t	        d&j                  tO        | j*                                    | j
                  ;d
| j
                  cxk  rdk  s&n t	        d'j                  | j
                              | j                  ]| j                  d
k  s*t        | j                  t        t        j                  f      s$t	        d(j                  | j                              | j                  ]| j                  d
k  s*t        | j                  t        t        j                  f      s$t	        d)j                  | j                              | j                  ]| j                  d
k  s*t        | j                  t        t        j                  f      s$t	        d*j                  | j                              t        | jP                  d+       | jR                  r`| j                  H| j*                  <| j                   0| j
                  $| j                  | j                  | j                  t	        d,      yy)-z
        Check arguments correctness and consistency.

        * adaptation and warmup args are consistent
        * if file(s) for metric are supplied, check contents.
        * length of per-chain lists equals specified # of chains
           z6Sampler expects number of chains to be greater than 0.NFz+Conflicting arguments: adapt_engaged: Falsez{}, adapt_delta: {}z{}, adapt_init_phase: {}z{}, adapt_metric_window: {}z{}, adapt_step_size: {}r   z?Value for iter_warmup must be a non-negative integer, found {}.z5Must specify iter_warmup > 0 when adapt_engaged=True.zBArgument "iter_sampling" must be a non-negative integer, found {}.r@   rA   z+Argument "step_size" must be > 0, found {}.z;Expecting {} per-chain step_size specifications,  found {}.z5Argument "step_size" must be > 0, chain {}, found {}.)diagdiag_erV   )densedense_erX   )unitunit_erZ   no such file {}
inv_metricz,Entry "inv_metric" not found in metric dict.rB   z.json)dirprefixsuffixzXNumber of metric files must match number of chains, found {} metric files for {} chains.c              3   <   K   | ]  }t        |t                y wN)r0   dict.0elems     r   	<genexpr>z'SamplerArgs.validate.<locals>.<genexpr>   s     F$z$-F   z9Entry "inv_metric" not found in metric dict for chain {}.zSFound inconsistent "inv_metric" entry for chain {}: entry has dims {}, expected {}.c              3   <   K   | ]  }t        |t                y wra   )r0   r+   rc   s     r   rf   z'SamplerArgs.validate.<locals>.<genexpr>   s     G4D#.Grg   z*Metrics files {}, {}, inconsistent metricszPArgument "metric" must be a list of pathnames or Python dicts, found list of {}.zInvalid metric specified, not a recognized metric type, must be either a metric type name, a filepath, dict, or list of per-chain filepaths or dicts.  Found an object of type {}.z8Argument "adapt_delta" must be between 0 and 1, found {}zDArgument "adapt_init_phase" must be a non-negative integer, found {}zHArgument "adapt_metric_window" must be a non-negative  integer, found {}zBArgument "adapt_step_size" must be a non-negative integer,found {}rJ   z<When fixed_param=True, cannot specify adaptation parameters.)*r0   r1   r2   r3   r4   rE   rF   rG   rH   rD   formatr=   r>   r6   r@   rA   rC   r8   r9   len	enumeraterB   r+   rN   ospathexistsr   rO   rb   listasarrayshaper   r   r   tupleallappendtyperJ   rI   )r   rR   msgirC   dims	dict_filemetric_filesrB   metric_dictdims2s              r   validatezSamplerArgs.validateb   s	    &3

"34
H  $%%-((0$$,!!U*C##//66sD<L<LMC((44;;T22C ++77>>T55C ''33::T11C !o%'!#:  3

"3, !!!'(8(8!9  1$);); K  )!!A%Z""S"**$5. !!!'(:(:!; 
 	TYY'T''9>>%RZZ E >>Q&$$$*F4>>$: 
 t~~&&0$%%+VFC4G%H  %.dnn$= LAy 1}(228&Q	2J  ;;"$++s+;;"44'/D$[[$88'0D$[[$66'/D$77>>$++6():)A)A$++)NOO&t{{3D4yA~+3(+4('+{{D$DKK.t{{2$F  BJJt{{<'@AGGHt9>'/D$'0D$2	  	4;;7#, DKK$7t{{#v-$@@F,fA  F$++FF.0L%.t{{%; 7	66<'{:",!006q1u#  6#' "

;|+D E K K$D %) "

;|+D E K K%E  $u}&0%77=v()AtU8&'" !" %; '%	 (	;?$++I6778 4yA~+3(+4('3D$G4;;GG#%L%.t{{%; 4	6)&#666!ww~~f5",->-E-Ef-M"NN6#.v#6D$/$7E"4yCJ6&0%<<BF(,A=&'" !"  $u}&0%<<BF(,A=&'" !" %++F3-4. 4yA~+3(+4('3D$$::@& Q0;  !, -3F43D,E	  't''+!+   &t'7'7 8    ,$$q(
%%RZZ'81 !((.t/D/D(E  ##/''!+:((3

*;4 !))/0H0H)I  +##a'z$$sBJJ&70 !%vd&:&:;  	T__l3*{{&~~)  ())1,,4((0 N  1 r!   idxcmdc                 z   |j                  d       | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  r|j                  d       | j                  |j                  d| j                          | j
                  r|j                  d       |S |j                  d       | j                  /|j                  d       |j                  d	| j                          | j                  Zt        | j                  t              s|j                  d
| j                          n!|j                  d
| j                  |           | j                  |j                  d| j                          | j                  Zt        | j                  t              s|j                  d| j                          n!|j                  d| j                  |           |j                  d       | j                  r|j                  d       n|j                  d       | j                  |j                  d| j                          | j                  |j                  d| j                          | j                   |j                  d| j                           | j"                  *|j                  dj%                  | j"                               | j&                  dkD  r*|j                  dj%                  | j&                               |S )T
        Compose CmdStan command for method-specific non-default arguments.
        zmethod=sampleznum_samples=znum_warmup=zsave_warmup=1zthin=zalgorithm=fixed_paramzalgorithm=hmczengine=nutsz
max_depth=z	stepsize=zmetric=zmetric_file=adapt	engaged=1	engaged=0zdelta=zinit_buffer=zwindow=zterm_buffer={}rT   znum_chains={})rt   r>   r=   r?   r@   rI   rA   rC   r0   ro   rB   rN   rO   rD   rE   rF   rG   rH   ri   rJ   r   r~   r   s      r   composezSamplerArgs.composeZ  s    	

?#)JJd&8&8%9:;'JJT%5%5$678JJ'99 JJtyyk*+JJ./JJJ')JJ}%JJD$6$6#789>>%dnnd3

Yt~~&678

Yt~~c':&;<=;;"JJ!1!1 234'd..5

\$*:*:);<=

\$*:*:3*?)@AB

7JJ{#JJ{#'JJ 0 0123  ,JJd&;&;%<=>##/JJ!9!9 :;<+JJ'..t/C/CDE??QJJ--doo>?
r!   )NNFNNNNTNNNNFrT   )r   r"   r#   r$   r
   r1   boolr   r+   r   r   r   r8   rQ   r}   r   r,   r!   r   r<   r<   9   sf   2 &*'+!"'+ 59"'+*.-1)-!#$%c]$%  }$% 	$%
 sm$%  }$% c3hcDc3h,@$F
$% UT12$% $% e_$% #3-$% &c]$% "#$%  !$%" #$%$ 
%$%Lvx} v vp13 1T#Y 149 1r!   r<   c                       e Zd ZdZh dZh dZ	 	 	 	 	 	 	 	 	 	 	 ddee   dee   dee	   de
d	ee   d
ee   dee   dee   dee   dee	   de
ddfdZddee	   ddfdZde	dee   dee   fdZy)OptimizeArgsz*Container for arguments for the optimizer.>   BFGSbfgsLBFGSlbfgsNewtonnewton>   tol_objtol_grad	tol_param
init_alphatol_rel_objhistory_sizetol_rel_gradN	algorithmr   itersave_iterationsr   r   r   r   r   r   jacobianr   c                     |xs d| _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        y )N )r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   s               r   rQ   zOptimizeArgs.__init__  sY     #b$	.& ("( r!   _chainsc                    | j                   rK| j                   | j                  vr3t        dj                  dj	                  | j                                    | j                   j                         dvr+| j                  D ]  }t        | |      t        | d       | j                   j                         dk7  r| j                  t        d      t        | j                  d       t        | j                  d	       t        | j                  d
       t        | j                  d       t        | j                  d       t        | j                   d       t        | j"                  d       t        | j                  d       y)>
        Check arguments correctness and consistency.
        z2Please specify optimizer algorithms as one of [{}], >   r   r   Nz0 requires that algorithm be set to bfgs or lbfgsr   z4history_size requires that algorithm be set to lbfgsr   r   r   r   r   r   r   r   )r   OPTIMIZE_ALGOSr4   ri   joinlower	bfgs_onlygetattrr   r:   r   r6   r   r   r   r   r   r   )r   r   args      r   r}   zOptimizeArgs.validate  sD    >>dnnD4G4GGDKKIId112  >>!)::~~ 4%1$%OP 
 >>!W,  , J  	t5TYY't||Y/t''7t}}j1t((.9t~~{3T&&7r!   _idxr   c                    |j                  d       | j                  r,|j                  d| j                  j                                 | j                  |j                  d| j                          | j                  |j                  d| j                          | j
                  |j                  d| j
                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d	| j                          | j                  |j                  d
| j                          | j                  r|j                  d       | j                  r|j                  d       |S )>compose command string for CmdStan for non-default arg values.zmethod=optimize
algorithm=init_alpha=tol_obj=tol_rel_obj=	tol_grad=tol_rel_grad=
tol_param=history_size=iter=zsave_iterations=1z
jacobian=1)rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s      r   r   zOptimizeArgs.compose  s~   

$%>>JJDNN$8$8$:#;<=??&JJT__$567<<#JJ$,,01'JJd&6&6%789==$JJ4==/23(JJt'8'8&9:;>>%JJDNN#345(JJt'8'8&9:;99 JJtyyk*+JJ*+==JJ|$
r!   )NNNFNNNNNNFra   )r   r"   r#   r$   r   r   r
   r+   r8   r1   r   rQ   r}   r   r   r,   r!   r   r   r     s   4KNI $(&*" %#''+$((,%)&*!C=! UO! sm	!
 ! %! e_! 5/! uo! E?! sm! ! 
!48 8 8@C d3i DI r!   r   c            	       j    e Zd ZdZ	 ddedee   deddfdZddee   ddfd	Z	d
ede
e   de
e   fdZy)LaplaceArgsz$Arguments needed for laplace method.Nmodedrawsr   r   c                 .    || _         || _        || _        y ra   )r   r   r   )r   r   r   r   s       r   rQ   zLaplaceArgs.__init__  s     	 
r!   r   c                     t         j                  j                  | j                        st	        d| j                         t        | j                  d       y)z,Check arguments correctness and consistency.zInvalid path for mode file: r   N)rl   rm   rn   r   r4   r6   r   r   r   s     r   r}   zLaplaceArgs.validate  s;    ww~~dii(;DII;GHHTZZ)r!   r   r   c                     |j                  d       |j                  d| j                          | j                  r|j                  d| j                          | j                  s|j                  d       |S )r   zmethod=laplacezmode=zdraws=z
jacobian=0)rt   r   r   r   r   s      r   r   zLaplaceArgs.compose  s\    

#$

U499+&'::JJ

|,-}}JJ|$
r!   )NTra   )r   r"   r#   r$   r+   r
   r1   r   rQ   r}   r   r   r,   r!   r   r   r     sn    . HL (@D	* * *C d3i DI r!   r   c            !           e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddee   dee   dee   dee   dee   dee   d	ee   d
ee   dee   dee   dee   dee   dedededdf dZddee   ddfdZ	dede
e   de
e   fdZy)PathfinderArgsz'Container for arguments for Pathfinder.Nr   r   r   r   r   r   r   num_psis_draws	num_pathsmax_lbfgs_iters	num_drawsnum_elbo_drawssave_single_pathspsis_resamplecalculate_lpr   c                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        || _        || _        || _        y ra   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                   r   rQ   zPathfinderArgs.__init__  sv    $ %& ("(,".",!2*(r!   r   c                    t        | j                  d       t        | j                  d       t        | j                  d       t        | j                  d       t        | j
                  d       t        | j                  d       t        | j                  d       t        | j                  d       t        | j                  d	       t        | j                  d
       t        | j                  d       t        | j                  d       y)r   r   r   r   r   r   r   r   r   r   r   r   r   N)r:   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   s     r   r}   zPathfinderArgs.validate4  s     	t5t||Y/t''7t}}j1t((.9t~~{3T&&7T((*:;T^^[1T))+<=T^^[1T((*:;r!   r   r   c                    |j                  d       | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j
                  |j                  d| j
                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d	| j                          | j                  |j                  d
| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  r|j                  d       | j                  s|j                  d       | j                  s|j                  d       |S )r   zmethod=pathfinderr   r   r   r   r   r   r   znum_psis_draws=z
num_paths=zmax_lbfgs_iters=z
num_draws=znum_elbo_draws=zsave_single_paths=1zpsis_resample=0zcalculate_lp=0)rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s      r   r   zPathfinderArgs.composeF  s   

&'??&JJT__$567<<#JJ$,,01'JJd&6&6%789==$JJ4==/23(JJt'8'8&9:;>>%JJDNN#345(JJt'8'8&9:;*JJ)<)<(=>?>>%JJDNN#345+JJ)$*>*>)?@A>>%JJDNN#345*JJ)<)<(=>?!!JJ,-!!JJ()  JJ'(
r!   )NNNNNNNNNNNNFTTra   )r   r"   r#   r$   r
   r8   r1   r   rQ   r}   r   r+   r   r,   r!   r   r   r     sA   1 '+#''+$((,%)&*(,#')-#'(,"'"!!")UO") %") e_	")
 5/") uo") E?") sm") !") C=") "#") C=") !")  ") ")  !")" 
#")H< < <$'C 'd3i 'DI 'r!   r   c                   `    e Zd ZdZdee   ddfdZ	 ddee   ddfdZ	ded	ee   dee   fd
Z
y)GenerateQuantitiesArgsz0Arguments needed for generate_quantities method.	csv_filesr   Nc                     || _         yrL   )sample_csv_files)r   r   s     r   rQ   zGenerateQuantitiesArgs.__init__s  s
     )r!   rR   c                     | j                   D ];  }t        j                  j                  |      r#t	        dj                  |             y)zk
        Check arguments correctness and consistency.

        * check that sample csv files exist
        z$Invalid path for sample csv file: {}N)r   rl   rm   rn   r4   ri   )r   rR   csvs      r   r}   zGenerateQuantitiesArgs.validatew  sD     (( 	C77>>#& :AA#F 	r!   r~   r   c                 j    |j                  d       |j                  d| j                  |           |S )r   zmethod=generate_quantitieszfitted_params=)rt   r   r   s      r   r   zGenerateQuantitiesArgs.compose  s5     	

/0

^D$9$9#$>#?@A
r!   ra   )r   r"   r#   r$   r   r+   rQ   r
   r1   r}   r   r,   r!   r   r   r   p  s\    :*$s) * *
 '+sm	3 T#Y 49 r!   r   c                       e Zd ZdZddhZ	 	 	 	 	 	 	 	 	 	 ddee   dee   dee   dee   d	ee   d
ee   de	dee   dee   dee   ddfdZ
	 ddee   ddfdZdedee   dee   fdZy)VariationalArgsz(Arguments needed for variational method.	meanfieldfullrankNr   r   grad_sampleselbo_sampleseta
adapt_iterrD   r   	eval_elbooutput_samplesr   c                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        y ra   )
r   r   r   r   r   r   rD   r   r   r   )r   r   r   r   r   r   r   rD   r   r   r   s              r   rQ   zVariationalArgs.__init__  sO     #	(($*&",r!   rR   c                    | j                   K| j                   | j                  vr3t        dj                  dj	                  | j                                    t        | j                  d       t        | j                  d       t        | j                  d       t        | j                  d       t        | j                  d       t        | j                  d	       t        | j                  d
       t        | j                  d       y)r   Nz4Please specify variational algorithms as one of [{}]r   r   r   r   r   r   r   r   r   )r   VARIATIONAL_ALGOSr4   ri   r   r6   r   r   r   r:   r   r   r   r   r   )r   rR   s     r   r}   zVariationalArgs.validate  s     NN&d&<&<<FMMIId445 
 	TYY'T&&7T&&7txx'T__l3t''7T^^[1T((*:;r!   r~   r   c                    |j                  d       | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          | j
                  |j                  d| j
                          |j                  d       | j                  r<|j                  d       | j                  0|j                  d| j                          n|j                  d	       | j                  |j                  d
| j                          | j                  |j                  d| j                          | j                  |j                  d| j                          |S )r   zmethod=variationalr   r   zgrad_samples=zelbo_samples=zeta=r   r   r   r   z
eval_elbo=zoutput_samples=)rt   r   r   r   r   r   rD   r   r   r   r   r   s      r   r   zVariationalArgs.compose  s    	

'(>>%JJDNN#34599 JJtyyk*+(JJt'8'8&9:;(JJt'8'8&9:;88JJdhhZ()

7JJ{#*

U4??"345JJ{#'JJd&6&6%789>>%JJDNN#345*JJ)<)<(=>?
r!   )
NNNNNNTNNNra   )r   r"   r#   r$   r   r
   r+   r1   r8   r   rQ   r}   r   r   r,   r!   r   r   r     s   2$j1 $("&*&*#$("'+#'(,-C=- sm- sm	-
 sm- e_- SM- - e_- C=- !- 
-2 '+<sm<	<23 T#Y 49 r!   r   c                      e Zd ZdZ	 	 	 	 	 	 	 	 ddededeee      de	e
eeeeef   de	eeef   edf   de	eee   df   d	e	eeeee   df   d
edee   dededee   ddfdZddZddddededee   dee   dee   f
dZy)CmdStanArgsz
    Container for CmdStan command line arguments.
    Consists of arguments common to all methods and
    and an object which contains the method-specific arguments.
    N
model_name	model_exe	chain_idsmethod_argsdataseedinits
output_dirsig_figssave_latent_dynamicssave_profilerefreshr   c                 *   || _         || _        || _        || _        || _        || _        || _        |	| _        |
| _        || _	        || _
        || _        t        |t              rt        j                  | _        nt        |t"              rt        j$                  | _        nt        |t&              rt        j(                  | _        nt        |t*              rt        j,                  | _        not        |t.              rt        j0                  | _        nIt        |t2              rt        j4                  | _        n#t7        dj9                  t;        |                  | j                  j=                  |rt?        |      nd       | j=                          y)rM   z Unsupported method args type: {}N) r   r   r   r   r   r   r   r   r   r   r   r   r0   r<   r   r%   methodr   r&   r   r'   r   r(   r   r)   r   r*   r4   ri   ru   r}   rj   )r   r   r   r   r   r   r   r   r   r   r   r   r   s                r   rQ   zCmdStanArgs.__init__  s'   . %""		
$ $8!(&k;/ --DK\2 //DK%;< 44DK_5 ,,DK[1 ..DK^4 ++DK299${:KL  	!!I#i.4Hr!   c                 `   | j                   t        d      | j                  t        d      | j                  0| j                  D ]!  }|dk  s	t        dj	                  |             | j
                  lt        j                  j                  t        j                  j                  | j
                              | _        t        j                  j                  | j
                        sD	 t        j                  | j
                         t               j                  d| j
                         t        j                  j!                  | j
                        s$t        dj	                  | j
                              	 t        j                  j#                  | j
                  t%        t'                           }t)        |d	      5  	 ddd       t        j*                  |       | j.                  ]t1        | j.                  t2        t4        j6                  f      r| j.                  dk  r$t        dj	                  | j.                              | j8                  t1        | j8                  t2        t4        j6                  f      r| j8                  dk  s| j8                  dkD  r$t        dj	                  | j8                              t;        dd      rld| _        t               j=                  dt        j                  j?                  tA                     t        j                  jC                  tA                            | jD                  3tG               }|jI                  ddd      jK                         | _"        nwt1        | jD                  t2        tL        t4        j6                  f      s$t        dj	                  | jD                              t1        | jD                  t2        t4        j6                  f      rB| jD                  dk  s| jD                  dkD  rt        dj	                  | jD                              | j                  t        d      tO        | jD                        tO        | j                        k7  rAt        dj	                  tO        | jD                        tO        | j                                    | jD                  D ]&  }|dk  s|dkD  st        dj	                  |             t1        | jP                  t$              rMt        j                  j                  | jP                        s[t        dj	                  | jP                              | jP                  +t1        | jP                  t$        tR        f      st        d      | jT                  t1        | jT                  tV        t2        t4        jX                  t4        j6                  f      r4| jT                  dk  r$t        dj	                  | jT                              yt1        | jT                  t$              rt1        | jZ                  t\              r| jZ                  j^                  dkD  sit1        | jZ                  t`              sNt        j                  j                  | jT                        s$t        dj	                  | jT                              yyyt1        | jT                  tL              r| j                  t        d      tO        | jT                        tO        | j                        k7  rAt        dj	                  tO        | jT                        tO        | j                                    | jT                  D ];  }t        j                  j                  |      r#t        dj	                  |             yyy# t        t        f$ r*}t        dj	                  | j
                              |d}~ww xY w# 1 sw Y   (xY w# t,        $ r*}t        d
j	                  | j
                              |d}~ww xY w)a
  
        Check arguments correctness and consistency.

        * input files must exist
        * output files must be in a writeable directory
        * if no seed specified, set random seed.
        * length of per-chain lists equals specified # of chains
        Nzno stan model specifiedzmodel not compiledrT   zinvalid chain_id {}zcreated output directory: %sz/Invalid path for output files, no such dir: {}.z,Specified output_dir is not a directory: {}.zw+z7Invalid path for output files, cannot write to dir: {}.z>Argument "refresh" must be a positive integer value, found {}.   zAArgument "sig_figs" must be an integer between 1 and 18, found {}      zYArgument "sig_figs" invalid for CmdStan versions < 2.25, using version %s in directory %si )lowhighsizezCArgument "seed" must be an integer between 0 and 2**32-1, found {}.r   l    zTList of per-chain seeds cannot be evaluated without corresponding list of chain_ids.zINumber of seeds must match number of chains, found {} seed for {} chains.zHArgument "seed" must be an integer value between 0 and 2**32-1, found {}r[   z&Argument "data" must be string or dictz&Argument "inits" must be > 0, found {}zPList of inits files cannot be evaluated without corresponding list of chain_ids.zVNumber of inits files must match number of chains, found {} inits files for {} chains.)1r   r4   r   r   ri   r   rl   rm   realpath
expanduserrn   makedirsr   infoRuntimeErrorPermissionErrorisdirr   r+   r   openremove	Exceptionr   r0   r1   r2   r3   r   r   warningbasenamer   dirnamer   r   integersitemro   rj   r   rb   r   r8   r9   r   r<   rJ   r   )r   chain_idexctestpathrngr   r   s          r   r}   zCmdStanArgs.validate   sF    ??"677>>!122>>% NN Ma<$%:%A%A(%KLLM ??& gg..""4??3DO 77>>$//2	KK0L%%6 77==1 BII 
	77<<TVE(D) 		(# <<#t||c2::->?<<!#   &t|| 4 
 ==$t}}sBJJ.?@==1$==2%   &t}} 5 
 &a, $$$7GG$$\^4GGOOLN3	 99-CQ?DDFDIdii#tRZZ)@A //5vdii/@  $))c2::%6799q=DII	$9$3396$))3D 
 >>)$;  tyy>S%88$88>		NC,?9  !II Dax4)#3(((.t  dii%77>>$)), !2!9!9$))!DEEYY":dii#t+MEFF::!$**uc2;;

&KL::>$@GG JJ  " DJJ,t//=((33a7!$"2"2NC77>>$**5():)A)A$**)MNN 6 D 8
 DJJ->>)$; 
 tzz?c$..&99$??Ev

OS-@@  "ZZ JE77>>%0():)A)A%)HIIJ .! "{ %o6 $++16$//+B     006t0G sJ   -A^1 >A_: _-_: 1_* %_%%_*-_72_: :	`-%`((`-)rP   profile_filer~   csv_filerP   r	  c                F   g }|| j                   |dk  s|t        | j                         dz
  kD  r.t        dj                  |t        | j                                     |j	                  | j
                         |j	                  d| j                   |           n|j	                  | j
                         | j                  |t        | j                  t              s0|j	                  d       |j	                  d| j                          n2|j	                  d       |j	                  d| j                  |           | j                  /|j	                  d       |j	                  d| j                          | j                  Zt        | j                  t              s|j	                  d	| j                          n!|j	                  d	| j                  |           |j	                  d
       |j	                  d|        |r|j	                  d|        |r|j	                  d|        | j                  |j	                  d| j                          | j                  |j	                  d| j                          | j                  j                  ||      }|S )zD
        Compose CmdStan command for non-default arguments.
        r   rT   z(index ({}) exceeds number of chains ({})zid=randomzseed=r   zfile=zinit=outputzdiagnostic_file=zprofile_file=zrefresh=z	sig_figs=)r   rj   r4   ri   rt   r   r   r0   ro   r   r   r   r   r   r   )r   r~   r
  rP   r	  r   s         r   compose_commandzCmdStanArgs.compose_command  s"    ?t~~9Qw#DNN 3a 77 >EES0 
 JJt~~&JJT^^C0123JJt~~&99 dii.

8$

U499+./

8$

U499S>"23499 JJvJJtyyk*+::!djj$/

U4::,/0

U4::c?"345

8

U8*%&JJ)/):;<JJ|n56<<#JJ$,,01==$JJ4==/23&&sC0
r!   )NNNNNFFN)r   N)r   r"   r#   r$   r+   OptionalPathr
   r   r1   r   r<   r   r   r   r   r   r	   r   r8   r   rQ   r}   r  r,   r!   r   r   r     s^   & 59,09=#'"&%*"!%)44  4 DI&	4
 "
4 GCH%sD014 CcD()4 S%d3i564  !!4" 3-#4$ #%4& '4( #)4* 
+4lYJ@ *.&*22 2
 "#2 sm2 
c2r!   r   )'r$   rl   enumr   r   r   typingr   r   r   r	   r
   r   numpyr2   numpy.randomr   	cmdstanpyr   cmdstanpy.utilsr   r   r   r   r   r   r+   PathLiker  r   r6   r:   r<   r   r   r   r   r   r   r,   r!   r   <module>r     s    
   < <  $   S"++t+,@T @< <3 <4 <># >S >T >R Rj
a aH 6` `F <R RjJ Jr!   