
    %gG@                        d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZ ddlZddlZddlmZmZmZ 	 	 	 	 	 d$dedede	e   de	e   d	ed
e	e   deeef   fdZd%dededeeef   fdZd%dededeeef   fdZdedeeef   fdZdedeeef   fdZde
deeef   dedefdZde
deeef   dedefdZde
deeef   dedefdZdedefdZdee   dee   fdZ de
deeef   dedefdZ!de
deeef   dededef
dZ"dedee   fdZ#dedee   fdZ$d ede	eeeee%ejL                  f   f      fd!Z'd"edeee%ejL                  f   fd#Z(y)&z3
Utility functions for reading the Stan CSV format
    N)AnyDictListMutableMappingOptionalTextIOUnion)_CMDSTAN_SAMPLING_CMDSTAN_THIN_CMDSTAN_WARMUPpathis_fixed_paramiter_samplingiter_warmupsave_warmupthinreturnc                 d   t        | |      }|t        }nO|t        kD  rFd|vrt        dj                  | |            |d   |k7  rt        dj                  | ||d               |}|t        }|}|t
        }t        t        j                  ||z              }t        t        j                  ||z              }|d   |k7  rt        dj                  | ||d               |rLd|v r|d   dv st        dj                  |             |d	   |k7  rt        d
j                  | ||d	               |S )z3Capture essential config, shape from stan_csv file.r   z6bad Stan CSV file {}, config error, expected thin = {}z@bad Stan CSV file {}, config error, expected thin = {}, found {}draws_samplingz1bad Stan CSV file {}, expected {} draws, found {}r   )   truez<bad Stan CSV file {}, config error, expected save_warmup = 1draws_warmupz8bad Stan CSV file {}, expected {} warmup draws, found {})	scan_sampler_csvr   
ValueErrorformatr
   r   intmathceil)	r   r   r   r   r   r   metar   r   s	            T/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/cmdstanpy/utils/stancsv.pycheck_sampler_csvr!      sw    D.1D|		3396$3E  <4==CV$V>  #N*L&tyy!456L>D#89:N/?FFnd+;&<
 	

 %$}*=*L99?  </55;V,^(<6  K    c                    i }d}t        | d      5 }	 t        |||      }t        |||      }|st        |||      }t	        |||      }t        ||||      }	 ddd       |S # t        $ r}t        d| z         |d}~ww xY w# 1 sw Y   |S xY w)z2Process sampler stan_csv output file line by line.r   rzError in reading csv file: N)openscan_configscan_column_namesscan_warmup_itersscan_hmc_paramsscan_sampling_itersr   )r   r   dictlinenofdes         r    r   r   F   s    DF	dC 	JB	J T62F&r48F!*2tV<(T6:(T6>JF	J K  	J:TABI	J	J Ks)   BAA""	A?+A::A??BB
save_itersc           	         i }d}t        | d      5 }t        |||      }t        |||      }d}|D ]  }|dz  }	 	 ddd       |r*t        j                  t        |d         ft        d      }t        | d      5 }t        |      D ]  }|j                           t              D ]  }|j                         j                         }t        |      dk  rt        dj                  | ||z               |j                  d	      }	|r |	D 
cg c]  }
t        |
       c}
|ddf<   ||dz
  k(  st        j                  |	t        
      } 	 ddd       |d<   |r|d<   |S # 1 sw Y   +xY wc c}
w # 1 sw Y   )xY w)z4Process optimizer stan_csv output file line by line.r   r$   r   Ncolumn_namesF)dtypeorderz*cannot parse CSV file {}, error at line {},)r3   mle	all_iters)r%   r&   r'   npemptylenfloatrangereadlinestripr   r   splitarray)r   r/   r+   r,   r-   itersliner7   ixsxr6   s               r    scan_optimize_csvrF   W   s   DF	dC BRv."2tV4 	DQJE		  "C^,-.e3!
	 
dC <Bv 	AKKM	u 	<A;;=&&(D4y1} @GGfqj 
 CB57"858"8	!Q$EAI~"$((2U";	<<" DK%[K? 0 #9< <s0   )E$;BE6E1E60E6$E.1E66E?c                     i }d}t        | d      5 }t        |||      }t        |||      }ddd       |S # 1 sw Y   |S xY w)z2Process laplace stan_csv output file line by line.r   r$   N)r%   r&   r'   )r   r+   r,   r-   s       r    scan_generic_csvrH   ~   sQ    DF	dC 5BRv."2tV45 K5 Ks	   6A c                    i }d}t        | d      5 }t        |||      }t        |||      }|j                         j	                  d      j                         }|dz  }|j                  d      r|j                         j	                  d      }|dz  }|j                  d      st        dj                  ||            |j                  d	      \  }}t        |      |d<   |j                         j	                  d      }|dz  }|j                  d
      }|D cg c]  }t        |       }	}t        j                  |	      |d<   t        j                  | d|dd      j                         |d<   ddd       |S c c}w # 1 sw Y   |S xY w)z/Process advi stan_csv output file line by line.r   r$    #	r   zStepsize adaptation complete.z #	
etaz%line {}: expecting eta, found:
	 "{}"=r5   variational_mean#Nhigh)commentskiprowsheaderfloat_precisionvariational_sample)r%   r&   r'   r=   lstriprstrip
startswithr   r   r?   r;   r8   r@   pdread_csvto_numpy)
r   r+   r,   r-   rB   _rK   rD   rE   rM   s
             r    scan_variational_csvr\      s~   DF	dC BRv."2tV4{{}##F+224!??:;;;=''1DaKF??5) =DD 
 ZZ_FAs*DK;;=''1DaKFZZ_.01E!H11#%88,<#= %'[["&
 (* 	!"+8 K 2'8 Ks   D	F E;,AF ;F  F
r-   config_dictr,   c                    | j                         }| j                         j                         }t        |      dkD  rE|j	                  d      r3|dz  }|j                  d      r|j                  dd      }|j                  d      }|j                  d      }t        |      dk(  r|d   j                         d	k(  r+|d   j                  d
      s|d   j                         |d<   nK|d   j                         d	k7  r5|d   j                         }	 t        |      }|||d   j                         <   | j                         }| j                         j                         }t        |      dkD  r|j	                  d      r3| j                  |       |S # t        $ r1 	 t        |      }n!# t        $ r |dk(  rd}n
|dk(  rd}n|}Y nw xY wY w xY w)zv
    Scan initial stan_csv file comments lines and
    save non-default configuration information to config_dict.
    r   rN   r   z	(Default) rJ   rL      filecsv	data_filer   false)tellr=   r>   r:   rW   endswithreplacerU   r?   r   r   r;   seek)r-   r]   r,   cur_posrB   key_valraw_valvals           r    r&   r&      s   
 ggiG;;= D
d)a-DOOC0!==%<<R0D{{6"**S/w<1qz!V+GAJ4G4G4N+21:+;+;+=K(!!#v-!!***,*g,C 36GAJ,,./''){{}""$5 d)a-DOOC06 GGGM " 	**#Gn% *"f,"#C$/"#C")C*	*s6   F 	G F,+G,G
G	G

GGc                    d|vr|S | j                         }| j                         j                         }d}t        |      dkD  ri|j	                  d      sX|dz  }|dz  }| j                         }| j                         j                         }t        |      dkD  r|j	                  d      sX| j                  |       ||d<   |S )z*
    Check warmup iterations, if any.
    r   r   rN   r   r   )re   r=   r>   r:   rW   rh   )r-   r]   r,   ri   rB   draws_founds         r    r(   r(      s     K'ggiG;;= DK
d)a- 4!q''){{}""$	 d)a- 4
 GGG"-KMr"   c                     | j                         j                         }|dz  }|j                         |d<   |j                  d      }t        t	        |            |d<   |S )zF
    Process columns header, add to config_dict as 'column_names'
    r   
raw_headerr5   r1   )r=   r>   r?   tuplemunge_varnames)r-   r]   r,   rB   namess        r    r'   r'      sW     ;;= D
aKF $

KJJsOE"'u(=">KMr"   namec                     d| vrd| vr| S | j                  d      }t        |      D ]9  \  }}d|vr|j                  ddd      }|j                  dd      }|dz  }|||<   ; dj                  |      S )N.:[r   r5   ])r?   	enumeraterg   join)rt   tuple_partsrC   parts       r    munge_varnamer~      s    
$3d?**S/K[) 4d?||Ca(||C%A 88K  r"   rs   c                 X    | t        d      | D cg c]  }t        |       c}S c c}w )z
    Change formatting for indices of container var elements
    from use of dot separator to array-like notation, e.g.,
    rewrite label ``y_forecast.2.4`` to ``y_forecast[2,4]``.
    zmissing argument "names")r   r~   )rs   rt   s     r    rr   rr     s.     }344,12DM$222s   'c                 j   |d   }| j                         j                         }|dz  }|dk(  st        dj                  ||            | j                         j                         }|dz  }|j	                  d      \  }}|j                  d      st        dj                  ||            	 t        |j                                | j                         }| j                         j                         }|dz  }|d
k(  r)|j                  d      r|S | j                  |       |dz
  S |dk(  r|dk(  s$|dk(  r|dk(  st        dj                  |            | j                         j                  d      }|dz  }t        |j	                  d            }	|dk(  r|S t        d|	      D ]]  }
| j                         j                  d      }|dz  }t        |j	                  d            |	k7  sEt        dj                  |             |S # t        $ r!}t        dj                  ||            |d	}~ww xY w)zC
    Scan step size, metric from  stan_csv file comment lines.
    metricr   z# Adaptation terminatedz(line {}: expecting metric, found:
	 "{}"rL   z# Step sizez+line {}: expecting step size, found:
	 "{}"zline {}: invalid step size: {}Nunit_ez# No free parametersdiag_ez+# Diagonal elements of inverse mass matrix:dense_ez"# Elements of inverse mass matrix:z5line {}: invalid or missing mass matrix specificationrJ   r5   )r=   r>   r   r   r?   rW   r;   re   rh   rU   r:   r<   )r-   r]   r,   r   rB   label	step_sizer.   before_metricnum_unconstrained_paramsr[   s              r    r)   r)     s@    "F;;= D
aKF,,8??M
 	
 ;;= D
aKFzz#E9M*$fVT2
 	
ioo 
 GGIM;;= D
aKF??12MGGM"A: hEE iD,P$P "F6N
 	
 ;;='D
aKF"4::c?3q23 	A;;=''/DaKF4::c?#'?? $$*F6N 		 S  ,33FIF
	s   -H 	H2H--H2c                    d}t        |d         }|s1|d   j                  d      }|d   j                  d      }|d   }d}	d}
| j                         }| j                         j	                         }t        |      dkD  r|j                  d      s|dz  }|dz  }|j                  d      }t        |      |k7  r7t        d	j                  ||t        |j                  d                  d
z         | j                         }| j                         j	                         }|s'	t        |         z  }	t        |         k(  r
dz  }
t        |      dkD  r|j                  d      s| j                  |       ||d<   |s
	|d<   
|d<   |S )z
    Parse sampling iteration, save number of iterations to config_dict.
    Also save number of divergences, max_treedepth hits
    r   r1   divergent__treedepth__	max_depthrN   r   r5   z0line {}: bad draw, expecting {} items, found {}
zThis error could be caused by running out of disk space.
Try clearing up TEMP or setting output_dir to a path on another drive.r   ct_divergencesct_max_treedepth)r:   indexre   r=   r>   rW   r?   r   r   r   rh   )r-   r]   r,   r   rn   num_colsidx_divergentidx_treedepthmax_treedepthr   r   ri   rB   datas                 r    r*   r*   R  s    K;~./H#N399-H#N399-H#K0ggiG;;= D
d)a- 4!qzz#t9 CJJHc$**S/&:%%  ''){{}""$c$}"566N4&'=8 A% % d)a- 4( GGG$/K !(6$%*:&'Mr"   c                    | j                  d      rut        | d      5 }t        j                  |      }ddd       dv r-t	        j
                  |d         }t        |j                        S t        dj                  |             t        t        |             }|t        dj                  |             |S # 1 sw Y   xY w)z`
    Read metric file in JSON or Rdump format.
    Return dimensions of entry "inv_metric".
    z.jsonr$   N
inv_metric1metric file {}, bad or missing entry "inv_metric")rf   r%   jsonloadr8   asarraylistshaper   r   read_rdump_metric)r   r-   metric_dictdims_npdimss        r    read_metricr     s    
 }}W$_ 	())B-K	(;&"$**[-F"GG&&&&,fTl 
 %d+,<&&,fTl  #	( 	(s   B99Cc                     t        |       }|!d|v rt        |d   t        j                        st	        dj                  |             t        |d   j                        S )zL
    Find dimensions of variable named 'inv_metric' in Rdump data file.
    r   r   )rload
isinstancer8   ndarrayr   r   r   r   )r   r   s     r    r   r     sa     +K#{<0"**=?FFtL
 	
 L)//00r"   fnamec                    i }t        | d      5 }|j                         }ddd       d}|t              k  r"d||   vr|dz  }|t        |      k  rd||   vr|t        |      k(  ry|}|dz  }	 |t        |      k  r"d||   vr|dz  }|t        |      k  rd||   vr|}dj                  |||       j	                  dd      }|j                  d      D cg c]  }|j                          c}\  }	}
|	j	                  dd      }	|
j	                  d	d      }
t        |
      ||	<   |t        |      k(  r	 |S |}|dz  }# 1 sw Y   $xY wc c}w )
a  Parse data and parameter variable values from an R dump format file.
    This parser only supports the subset of R dump data as described
    in the "Dump Data Format" section of the CmdStan manual, i.e.,
    scalar, vector, matrix, and array data types.
    r$   Nr   z<-r   r_   
"L)r%   	readlinesr:   r{   rg   r?   r>   parse_rdump_value)r   	data_dictr-   linesidx	start_idxnext_varvar_dataitemlhsrhss              r    r   r     sw    I	eS	 R C
E

t5:5q E

t5:5
c%jI1HC
CJ4uSz#91HC CJ4uSz#9775845==dBG-5^^D-ABTDJJLBSkk#r"kk#r"*3/	##e*  	q   Cs   EEEr   c                    t        j                  d      }	 | j                  d      r|j                  |       }||j	                  d      t        |       |j	                  d      j                  d      D cg c]  }t        |       }}t        j                  |d      }|j	                  d      |j	                  d      j                  d      D cg c]  }t        |       }}t        j                  |      j                  |d      }	 |S | j                  d	      rQ| j                  d
      r@t        j                  | dd j                  d      D cg c]  }t        |       c}      }|S d| v sd| v rt        |       }|S t        |       }|S c c}w c c}w c c}w # t        $ r }t        dj                  |             |d}~ww xY w)zProcess right hand side of Rdump variable assignment statement.
    Value is either scalar, vector, or multi-dim structure.
    Use regex to capture structure values, dimensions.
    zQstructure\(\s*c\((?P<vals>[^)]*)\)(,\s*\.Dim\s*=\s*c\s*\((?P<dims>[^)]*)\s*\))?\)	structureNvalsr5   r2   )r4   r   zc()r`   rv   r.   zbad value in Rdump file: {})recompilerW   matchgroupr   r?   r;   r8   r@   r   reshaperf   	TypeErrorr   )	r   patparsevr   rl   r   r   r.   s	            r    r   r     s   
 **	;C
K>>+&IIcNE}F 3 ; o%&+kk&&9&?&?&DEE!HEDE((4s+C{{6".(-F(;(A(A#(FG1AGGhhtn,,T,= J ^^D!cll3&7((C"IOOC4HIDE$KIJC J CZ3#:*C
 J c(C J F H J
  K6==cBCJKsV   A"F' 9FAF' F)(F' AF' F"-F' 6F' F' F' '	G0GG)FNNFN)F))__doc__r   r   r   typingr   r   r   r   r   r   r	   numpyr8   pandasrX   	cmdstanpyr
   r   r   strboolr   r!   r   rF   rH   r\   r&   r(   r'   r~   rr   r)   r*   r   r   r;   r   r   r    r"   r    <module>r      s     	 K K K   G G
 !#'!%4
44 C=4 #	4
 4 3-4 
#s(^4n3  c3h "$C $T $d38n $N3 4S>  s  tCH~  F#F #c3h # # #L!#s(^58*+CH5?B! ! ! 3$s) 3S	 3@@!#s(^@58@@F++!#s(^+58+JN++\c d3i 41C 1DI 1 $sE#ubjj2H,I'I"JK B3 5eRZZ)?#@ r"   