"""Container objects for results of CmdStan run(s)."""importglobimportosfromtypingimportAny,Dict,List,Optional,Unionfromcmdstanpy.cmdstan_argsimport(CmdStanArgs,LaplaceArgs,OptimizeArgs,PathfinderArgs,SamplerArgs,VariationalArgs,)fromcmdstanpy.utilsimportcheck_sampler_csv,get_logger,scan_configfrom.gqimportCmdStanGQfrom.laplaceimportCmdStanLaplacefrom.mcmcimportCmdStanMCMCfrom.metadataimportInferenceMetadatafrom.mleimportCmdStanMLEfrom.pathfinderimportCmdStanPathfinderfrom.runsetimportRunSetfrom.vbimportCmdStanVB__all__=["RunSet","InferenceMetadata","CmdStanMCMC","CmdStanMLE","CmdStanVB","CmdStanGQ","CmdStanLaplace","CmdStanPathfinder",]
[docs]deffrom_csv(path:Union[str,List[str],os.PathLike,None]=None,method:Optional[str]=None,)->Union[CmdStanMCMC,CmdStanMLE,CmdStanVB,CmdStanPathfinder,CmdStanLaplace,None]:""" Instantiate a CmdStan object from a the Stan CSV files from a CmdStan run. CSV files are specified from either a list of Stan CSV files or a single filepath which can be either a directory name, a Stan CSV filename, or a pathname pattern (i.e., a Python glob). The optional argument 'method' checks that the CSV files were produced by that method. Stan CSV files from CmdStan methods 'sample', 'optimize', and 'variational' result in objects of class CmdStanMCMC, CmdStanMLE, and CmdStanVB, respectively. :param path: directory path :param method: method name (optional) :return: either a CmdStanMCMC, CmdStanMLE, or CmdStanVB object """ifpathisNone:raiseValueError('Must specify path to Stan CSV files.')ifmethodisnotNoneandmethodnotin['sample','optimize','variational','laplace','pathfinder',]:raiseValueError('Bad method argument {}, must be one of: ''"sample", "optimize", "variational"'.format(method))csvfiles=[]ifisinstance(path,list):csvfiles=pathelifisinstance(path,str)and'*'inpath:splits=os.path.split(path)ifsplits[0]isnotNone:ifnot(os.path.exists(splits[0])andos.path.isdir(splits[0])):raiseValueError('Invalid path specification, {} '' unknown directory: {}'.format(path,splits[0]))csvfiles=glob.glob(path)elifisinstance(path,(str,os.PathLike)):ifos.path.exists(path)andos.path.isdir(path):forfileinos.listdir(path):ifos.path.splitext(file)[1]==".csv":csvfiles.append(os.path.join(path,file))elifos.path.exists(path):csvfiles.append(str(path))else:raiseValueError('Invalid path specification: {}'.format(path))else:raiseValueError('Invalid path specification: {}'.format(path))iflen(csvfiles)==0:raiseValueError('No CSV files found in directory {}'.format(path))forfileincsvfiles:ifnot(os.path.exists(file)andos.path.splitext(file)[1]==".csv"):raiseValueError('Bad CSV file path spec,'' includes non-csv file: {}'.format(file))config_dict:Dict[str,Any]={}try:withopen(csvfiles[0],'r')asfd:scan_config(fd,config_dict,0)except(IOError,OSError,PermissionError)ase:raiseValueError('Cannot read CSV file: {}'.format(csvfiles[0]))fromeif'model'notinconfig_dictor'method'notinconfig_dict:raiseValueError("File {} is not a Stan CSV file.".format(csvfiles[0]))ifmethodisnotNoneandmethod!=config_dict['method']:raiseValueError('Expecting Stan CSV output files from method {}, '' found outputs from method {}'.format(method,config_dict['method']))try:ifconfig_dict['method']=='sample':chains=len(csvfiles)sampler_args=SamplerArgs(iter_sampling=config_dict['num_samples'],iter_warmup=config_dict['num_warmup'],thin=config_dict['thin'],save_warmup=config_dict['save_warmup'],)# bugfix 425, check for fixed_params outputtry:check_sampler_csv(csvfiles[0],iter_sampling=config_dict['num_samples'],iter_warmup=config_dict['num_warmup'],thin=config_dict['thin'],save_warmup=config_dict['save_warmup'],)exceptValueError:try:check_sampler_csv(csvfiles[0],is_fixed_param=True,iter_sampling=config_dict['num_samples'],iter_warmup=config_dict['num_warmup'],thin=config_dict['thin'],save_warmup=config_dict['save_warmup'],)sampler_args=SamplerArgs(iter_sampling=config_dict['num_samples'],iter_warmup=config_dict['num_warmup'],thin=config_dict['thin'],save_warmup=config_dict['save_warmup'],fixed_param=True,)exceptValueErrorase:raiseValueError('Invalid or corrupt Stan CSV output file, ')fromecmdstan_args=CmdStanArgs(model_name=config_dict['model'],model_exe=config_dict['model'],chain_ids=[x+1forxinrange(chains)],method_args=sampler_args,)runset=RunSet(args=cmdstan_args,chains=chains)runset._csv_files=csvfilesforiinrange(len(runset._retcodes)):runset._set_retcode(i,0)fit=CmdStanMCMC(runset)fit.draws()returnfitelifconfig_dict['method']=='optimize':if'algorithm'notinconfig_dict:raiseValueError("Cannot find optimization algorithm"" in file {}.".format(csvfiles[0]))optimize_args=OptimizeArgs(algorithm=config_dict['algorithm'],save_iterations=config_dict['save_iterations'],jacobian=config_dict.get('jacobian',0),)cmdstan_args=CmdStanArgs(model_name=config_dict['model'],model_exe=config_dict['model'],chain_ids=None,method_args=optimize_args,)runset=RunSet(args=cmdstan_args)runset._csv_files=csvfilesforiinrange(len(runset._retcodes)):runset._set_retcode(i,0)returnCmdStanMLE(runset)elifconfig_dict['method']=='variational':if'algorithm'notinconfig_dict:raiseValueError("Cannot find variational algorithm"" in file {}.".format(csvfiles[0]))variational_args=VariationalArgs(algorithm=config_dict['algorithm'],iter=config_dict['iter'],grad_samples=config_dict['grad_samples'],elbo_samples=config_dict['elbo_samples'],eta=config_dict['eta'],tol_rel_obj=config_dict['tol_rel_obj'],eval_elbo=config_dict['eval_elbo'],output_samples=config_dict['output_samples'],)cmdstan_args=CmdStanArgs(model_name=config_dict['model'],model_exe=config_dict['model'],chain_ids=None,method_args=variational_args,)runset=RunSet(args=cmdstan_args)runset._csv_files=csvfilesforiinrange(len(runset._retcodes)):runset._set_retcode(i,0)returnCmdStanVB(runset)elifconfig_dict['method']=='laplace':laplace_args=LaplaceArgs(mode=config_dict['mode'],draws=config_dict['draws'],jacobian=config_dict['jacobian'],)cmdstan_args=CmdStanArgs(model_name=config_dict['model'],model_exe=config_dict['model'],chain_ids=None,method_args=laplace_args,)runset=RunSet(args=cmdstan_args)runset._csv_files=csvfilesforiinrange(len(runset._retcodes)):runset._set_retcode(i,0)mode:CmdStanMLE=from_csv(config_dict['mode'],method='optimize',)# type: ignorereturnCmdStanLaplace(runset,mode=mode)elifconfig_dict['method']=='pathfinder':pathfinder_args=PathfinderArgs(num_draws=config_dict['num_draws'],num_paths=config_dict['num_paths'],)cmdstan_args=CmdStanArgs(model_name=config_dict['model'],model_exe=config_dict['model'],chain_ids=None,method_args=pathfinder_args,)runset=RunSet(args=cmdstan_args)runset._csv_files=csvfilesforiinrange(len(runset._retcodes)):runset._set_retcode(i,0)returnCmdStanPathfinder(runset)else:get_logger().info('Unable to process CSV output files from method %s.',(config_dict['method']),)returnNoneexcept(IOError,OSError,PermissionError)ase:raiseValueError('An error occurred processing the CSV files:\n\t{}'.format(str(e)))frome