
    %gc*                         d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZ ddlmZ  G d	 d
      Zy)zU
Container for the information used in a generic CmdStan run,
such as file locations
    N)datetime)time)ListOptional)_TMPDIR)CmdStanArgsMethod)
get_loggerc                      e Zd ZdZ	 d)dddddededeee      d	ed
e	ddfdZ
defdZedefd       Zedefd       Zedefd       Zede	fd       Zedefd       Zedee   fd       Zdedee   fdZedee   fd       Zedee   fd       Zde	fdZedee   fd       Zedee   fd       Zddddededee   defd Zdedefd!Zded"eddfd#Zded"e	ddfd$Zdefd%Zd*d&ee   ddfd'Zd+d(Z y),RunSeta]  
    Encapsulates the configuration and results of a call to any CmdStan
    inference method. Records the method return code and locations of
    all console, error, and output files.

    RunSet objects are instantiated by the CmdStanModel class inference methods
    which validate all inputs, therefore "__init__" method skips input checks.
    Nz%Y%m%d%H%M%ST)	chain_idstime_fmtone_process_per_chainargschainsr   r   r   returnc                   || _         || _        || _        |r|| _        nd| _        t	        | j                        D cg c]  }d c}| _        t	        | j                        D cg c]  }d c}| _        |t	        |      D cg c]  }|dz   	 }}|| _        |j                  |j                  | _	        n*t        j                  |j                  t              | _	        |j                   dt        j                         j!                  |       | _        dg| j                  z  | _        dg| j                  z  | _        |rbt	        |      D ]S  }| j)                  d|	      | j$                  |<   |j*                  s0| j)                  d
d||         | j&                  |<   U nJ| j)                  d      | j$                  d<   |j*                  r | j)                  d
d      | j&                  d<   dg|z  | _        dg|z  | _        |dk(  rL| j)                  d
      | j,                  d<   |j0                  r!| j)                  d
d      | j.                  d<   yyt	        |      D ]V  }| j)                  d
||   	      | j,                  |<   |j0                  s3| j)                  d
d||         | j.                  |<   X yc c}w c c}w c c}w )z(Initialize object (no input arg checks).   FN)prefixdir- z-stdout.txt)id.csv-profileextrar   r   r   -diagnostic)_args_chains_one_process_per_chain
_num_procsrange	_retcodes_timeout_flags
_chain_ids
output_dir_output_dirtempfilemkdtemp
model_namer   r   nowstrftime_base_outfile_stdout_files_profile_files	file_pathsave_profile
_csv_files_diagnostic_filessave_latent_dynamics)selfr   r   r   r   r   _is           U/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/cmdstanpy/stanfit/runset.py__init__zRunSet.__init__   s    
&;# $DODO&+DOO&<="=.3DOO.DEuE(-f61Q6I6#??&#D  (//G D q!8!8!B CD 	 !TDOO3!dT__4 6] (,}(K""1%$$-1^^jYq\ .< .D''* %)NN=$ADq!  )-* *8 *##A&
 ')TF]"$Q;!%!7DOOA((,0NN- -; -&&q) )
 6] %)^^Fy|^%L",,04m	! 1? 1D**1-] >E6s   	J>&	KKc                 <   dj                  | j                  | j                  | j                        }dj                  || j	                  d            }dj                  || j
                        }| d}dj                  || j                  d         }| j                  j                  rdj                  || j                  d         }| j                  j                  rdj                  || j                  d         }d	j                  || j                  d         }|S )
Nz1RunSet: chains={}, chain_ids={}, num_processes={}z{}
 cmd (chain 1):
	{}r   z{}
 retcodes={}z0
 per-chain output files (showing chain 1 only):z{}
 csv_file:
	{}z{}
 diagnostics_file:
	{}z{}
 profile_file:
	{}z{}
 console_msgs (if any):
	{})formatr"   r(   r$   cmdr&   r5   r!   r7   r6   r4   r2   r1   )r8   reprs     r;   __repr__zRunSet.__repr__c   s   BIILL$//4??
 +11$D!((t~~>HI%,,T4??13EF::**188d,,Q/D ::""-44d))!,D 399$$$Q'
     c                 .    | j                   j                  S )zStan model name.)r!   r-   r8   s    r;   modelzRunSet.modelx   s     zz$$$rB   c                 .    | j                   j                  S )z)CmdStan method used to generate this fit.)r!   methodrD   s    r;   rG   zRunSet.method}   s     zz   rB   c                     | j                   S )zNumber of processes run.)r$   rD   s    r;   	num_procszRunSet.num_procs        rB   c                     | j                   S )a  
        When True, for each chain, call CmdStan in its own subprocess.
        When False, use CmdStan's `num_chains` arg to run parallel chains.
        Always True if CmdStan < 2.28.
        For CmdStan 2.28 and up, `sample` method determines value.
        )r#   rD   s    r;   r   zRunSet.one_process_per_chain   s     ***rB   c                     | j                   S )zNumber of chains.)r"   rD   s    r;   r   zRunSet.chains   s     ||rB   c                     | j                   S )z
Chain ids.)r(   rD   s    r;   r   zRunSet.chain_ids   rJ   rB   idxc           	         | j                   r{| j                  j                  || j                  |   | j                  j                  r| j
                  |   nd| j                  j                  r| j                  |         S d      S | j                  j                  || j                  d      | j                  j                  r| j                  dd      nd| j                  j                  r| j                  dd            S d      S )z
        Assemble CmdStan invocation.
        When running parallel chains from single process (2.28 and up),
        specify CmdStan arg `num_chains` and leave chain idx off CSV files.
        N)csv_filediagnostic_fileprofile_filer   r    r   r   )	r#   r!   compose_command	csv_filesr7   diagnostic_filesr4   profile_filesr3   r8   rN   s     r;   r?   z
RunSet.cmd   s    &&::--,::22 !% 5 5c :::** "//4 . 	 	  . 	 	 ::--/::22 !%v] K::** "^^F*^E . 	 	  . 	 	rB   c                     | j                   S )z&List of paths to CmdStan output files.)r5   rD   s    r;   rT   zRunSet.csv_files   rJ   rB   c                     | j                   S )z
        List of paths to transcript of CmdStan messages sent to the console.
        Transcripts include config information, progress, and error messages.
        )r1   rD   s    r;   stdout_fileszRunSet.stdout_files   s     !!!rB   c                 4    | j                   D ]	  }|dk7  s	 y y)z0Returns ``True`` when all chains have retcode 0.r   FTr&   )r8   codes     r;   _check_retcodeszRunSet._check_retcodes   s$    NN 	Dqy	 rB   c                     | j                   S )z6List of paths to CmdStan hamiltonian diagnostic files.)r6   rD   s    r;   rU   zRunSet.diagnostic_files   s     %%%rB   c                     | j                   S )z(List of paths to CmdStan profiler files.)r2   rD   s    r;   rV   zRunSet.profile_files   s     """rB   r   r   suffixr   r   c                    |d| | }t         j                  j                  | j                  | j                   | |       }|S )Nr9   )ospathjoinr*   r0   )r8   ra   r   r   files        r;   r3   zRunSet.file_path   sQ     >VH%Fww||!3!3 4UGF8D
 rB   c                      | j                   |   S )zGet retcode for process[idx].r\   rW   s     r;   _retcodezRunSet._retcode   s    ~~c""rB   valc                 "    || j                   |<   y)z#Set retcode at process[idx] to val.Nr\   r8   rN   ri   s      r;   _set_retcodezRunSet._set_retcode   s    !srB   c                 "    || j                   |<   y)z(Set timeout_flag at process[idx] to val.N)r'   rk   s      r;   _set_timeout_flagzRunSet._set_timeout_flag   s    #&C rB   c                 v   g }t        | j                        D ]t  }t        j                  j	                  | j
                  |         s1t        j                  | j
                  |         j                  dkD  sa| j                  j                  t        j                  k(  rS|j                  d       t        | j
                  d   d      5 }|j                  |j                                ddd       t        | j
                  |   d      5 }|j                         }t        j                   dt        j"                        }t        j$                  ||      }t'        |      dkD  r |j                  dj)                  |             ddd       w dj)                  |      S # 1 sw Y   xY w# 1 sw Y   xY w)z-Checks console messages for each CmdStan run.r   zconsole log output:
rNz	^E[rx].*$z
	
)r%   r$   rc   rd   existsr1   statst_sizer!   rG   r	   OPTIMIZEappendopenreadrecompileMfindalllenre   )r8   msgsr:   fdcontentspaterrorss          r;   get_err_msgszRunSet.get_err_msgs   sT   t' 	=At11!45GGD..q12::Q>::$$7KK 78d003S9 /RBGGI./ / d003S9 =R#%779 jjrtt<!#C!:v;? KKF(;<= =	=" yy/ /= =s   
 F!A9F.!F+	.F8	r   c                    |t         j                  j                  d      }t         j                  j                  |t	        t                           }	 t        j                  |d       t        |d      5  	 ddd       t        j                  |       t        | j                        D ]4  }t         j                  j!                  | j"                  |         s't%        dj                  | j"                  |               t         j                  j                  |t         j                  j'                  | j"                  |               }t         j                  j!                  |      rt%        dj                  |            	 t)               j+                  d	| j"                  |   |       t-        j.                  | j"                  |   |       || j"                  |<   7 y# 1 sw Y   mxY w# t        t        t        f$ r }t        dj                  |            |d}~ww xY w# t        t        t        f$ r }t%        d
j                  |            |d}~ww xY w)z
        Moves CSV files to specified directory.

        :param dir: directory path

        See Also
        --------
        cmdstanpy.from_csv
        N.T)exist_okwzCannot save to path: {}zCannot access CSV file {}z File exists, not overwriting: {}zsaving tmpfile: "%s" as: "%s"zCannot save to file: {})rc   rd   realpathre   strr   makedirsrw   removeIOErrorOSErrorPermissionErrorRuntimeErrorr>   r%   r   rr   r5   
ValueErrorbasenamer
   debugshutilmove)r8   r   	test_pathexcr:   to_pathes          r;   save_csvfileszRunSet.save_csvfiles  s    ;''""3'CGGLLc$&k2		OKKd+i% IIi  t{{# 	A77>>$//!"45 /66tq7IJ  ggll3(8(89K(LMGww~~g& 6==gF 	""3T__Q5G DOOA.8%,"!	  /2 	O8??DE3N	O( Wo6  -44W=sI   #G1 7G$9G1 AH($G.)G1 1H%H  H%(I<IIc                     t        | j                        r.t        t        | j                         d| j                   d      y )Nz of z processes timed out)anyr'   TimeoutErrorsumrI   rD   s    r;   raise_for_timeoutszRunSet.raise_for_timeouts.  sI    t""#t**+,D0@ A   $rB   )r   )N)r   N)!__name__
__module____qualname____doc__r   intr   r   r   boolr<   rA   propertyrE   r	   rG   rI   r   r   r   r?   rT   rZ   r^   rU   rV   r3   rh   rl   rn   r   r   r    rB   r;   r   r      s^    D
 *.&&*DD D
 DI&D D  $D 
DL# * %s % % ! ! ! 3   +t + +    49  s tCy : 49   "d3i " "  &$s) & & #tCy # # ,.4%(3;C=	#C #C #" "# "$ "'S 't ' 'c ,)# )$ )VrB   r   )r   rc   ry   r   r+   r   r   typingr   r   	cmdstanpyr   cmdstanpy.cmdstan_argsr   r	   cmdstanpy.utilsr
   r   r   rB   r;   <module>r      s6   
 
 	     !  6 &` `rB   