def np_diagnostics(self): feature_names = ["num_restarts", "num_divergent","hit_max_tree_depth","ave_num_transitions","total_num_transitions","bfmi","lp_ess", "lp_rhat", "difficulty","num_chains_removed","min_ess","median_ess","percent_rhat"] self.remove_failed_chains() out = self.get_diagnostics(permuted=False) num_restarts = self.metadata.num_restarts num_chains_removed = self.metadata.num_chains_removed if self.tune_dict["dynamic"]: processed_diag = process_diagnostics(out, name_list=["hit_max_tree_depth"]) hit_max_tree_depth = numpy.squeeze(processed_diag.sum(axis=1)) else: hit_max_tree_depth = 0 processed_diag = process_diagnostics(out, name_list=["divergent"]) num_divergent = numpy.squeeze(processed_diag.sum(axis=1)) processed_diag = process_diagnostics(out, name_list=["num_transitions"]) total_num_transitions = numpy.sum(processed_diag) ave_num_transitions = numpy.squeeze(processed_diag.mean(axis=1)) energy_summary = energy_diagnostics(diagnostics_obj=out) mixed_mcmc_tensor = self.get_samples(permuted=True) mcmc_cov = numpy.cov(mixed_mcmc_tensor, rowvar=False) mcmc_sd_vec = numpy.sqrt(numpy.diagonal(mcmc_cov)) difficulty = max(mcmc_sd_vec) / min(mcmc_sd_vec) mcmc_samples = self.get_samples(permuted=False) out_dict = diagnostics_stan(mcmc_samples) min_ess = min(out_dict["ess"]) median_ess = numpy.median(out_dict["ess"]) percent_rhat = sum(out_dict["rhat"]<1.05)/len(out_dict["rhat"]) num_id = self.num_chains output = numpy.zeros((num_id, len(feature_names))) output[:, 0] = num_restarts output[:, 1] = num_divergent output[:, 2] = hit_max_tree_depth output[:, 3] = ave_num_transitions output[:, 4] = total_num_transitions output[:, 5] = energy_summary["bfmi_list"] output[:, 6] = energy_summary["ess"] output[:, 7] = energy_summary["rhat"] output[:, 8] = difficulty output[:, 9] = num_chains_removed output[:,10] = min_ess output[:,11] = median_ess output[:,12] = percent_rhat return(output,feature_names)
def get_diagnostics(sampler): # # want to return numpy array of dimensions [num_chains,9] # as well as list of column names feature_names = [ "num_restarts", "num_divergent", "num_hit_max_tree_depth", "ave_num_transitions", "bfmi", "lp_ess", "lp_rhat", "difficulty" ] feature_names = ["num_chains_removed"] sampler.remove_failed_chains() out = sampler.get_diagnostics(permuted=False) num_restarts = sampler.metadata.num_restarts num_chains_removed = sampler.metadata.num_chains_removed processed_diag = process_diagnostics(out, name_list=["divergent"]) num_divergent = processed_diag.sum(axis=1) processed_diag = process_diagnostics(out, name_list=["hit_max_tree_depth"]) hix_max_tree_depth = processed_diag.sum(axis=1) processed_diag = process_diagnostics(out, name_list=["num_transitions"]) ave_num_transitions = processed_diag.mean(axis=1) energy_summary = energy_diagnostics(diagnostics_obj=out) mixed_mcmc_tensor = sampler.get_samples(permuted=True) mcmc_cov = numpy.cov(mixed_mcmc_tensor, rowvar=False) mcmc_sd_vec = numpy.sqrt(numpy.diagonal(mcmc_cov)) difficulty = max(mcmc_sd_vec) / min(mcmc_sd_vec) num_id = sampler.num_chains output = numpy.zeros(num_id, len(feature_names)) output[:, 0] = num_restarts output[:, 1] = num_divergent output[:, 2] = hix_max_tree_depth output[:, 3] = ave_num_transitions output[:, 4] = energy_summary["bfmi_list"] output[:, 5] = energy_summary["ess"] output[:, 6] = energy_summary["rhat"] output[:, 7] = difficulty output[:, 8] = num_chains_removed return (output, feature_names)
print(get_short_diagnostics(full_mcmc_tensor)) out = sampler1.get_diagnostics(permuted=False) print("divergent") processed_diag = process_diagnostics(out,name_list=["divergent"]) print(processed_diag.sum(axis=1)) #print(processed_diag.shape) #processed_energy = process_diagnostics(out,name_list=["prop_H"]) print(energy_diagnostics(diagnostics_obj=out)) mcmc_samples_mixed = sampler1.get_samples(permuted=True) #target_dataset = get_data_dict("8x8mnist") v_generator = wrap_V_class_with_input_data(class_constructor=V_fc_model_1,input_data=input_data,prior_dict=prior_dict,model_dict=model_dict) precision_type = "torch.DoubleTensor" te2,predicted2 = test_error(input_data,v_obj=v_generator(precision_type=precision_type),mcmc_samples=mcmc_samples_mixed,type="classification",memory_efficient=False) print(te2) mixed_mcmc_tensor = sampler1.get_samples(permuted=True) print(mixed_mcmc_tensor) mcmc_cov = numpy.cov(mixed_mcmc_tensor,rowvar=False) mcmc_sd_vec = numpy.sqrt(numpy.diagonal(mcmc_cov))