# -*- coding: utf-8 -*-## This file is subject to the terms and conditions defined in# file 'LICENSE.txt', which is part of this source code package.##importosimportpickleimportnumpyasnpimportyamlfromsklearn.metricsimportr2_scorefromtqdmimporttqdmfrommmgp.utilsimportremove_file,reset_folderfromplaid.problem_definitionimportProblemDefinitionfromplaid.containers.datasetimportDataset
[docs]defcompute_metrics(configuration:dict,problem:ProblemDefinition)->dict:"""Compute and print various metrics for a given ProblemDefinition instance and configuration settings. Args: configuration (dict): A dictionary containing various parameters and settings for the metric computation. It should include the following keys: - 'generated_data_folder' (str): A string representing the folder where the predicted data is stored. - 'regression' (dict): A dictionary containing regression-related parameters with the following keys: problem (ProblemDefinition): An instance of the ProblemDefinition class containing problem-specific information, including output scalars and fields. Caution: This function will load all the predicted data. Make sure it has been created and is located correctly. """generated_data_folder=configuration['generated_data_folder']verbose=configuration['verbose']train_set_name=configuration["train_set"]test_set_name=configuration["test_set"]problem_split={}problem_split[train_set_name]=problem.get_split(train_set_name)problem_split[test_set_name]=problem.get_split(test_set_name)out_scalars_names=problem.out_scalars_namesout_fields_names=problem.out_fields_namesremove_file(generated_data_folder+os.sep+"metrics.yaml")file=open(generated_data_folder+os.sep+"allPredictedData.pkl",'rb')predicted_data=pickle.load(file)file.close()rel_SE_out_fields={}rel_SE_out_scalars={}r2OutFields={}r2OutScalars={}tolerance=1.e-6forsplit_name,split_indicesinproblem_split.items():rel_SE_out_fields[split_name]={}r2OutFields[split_name]={}forfnameinout_fields_names:rel_SE_out_fields[split_name][fname]=np.empty(len(split_indices))r2OutFields[split_name][fname]=0.0rel_SE_out_scalars[split_name]={}r2OutScalars[split_name]={}forsnameinout_scalars_names:rel_SE_out_scalars[split_name][sname]=np.empty(len(split_indices))r2OutScalars[split_name][sname]=0.0ifverbose:print("Compute metrics for each regressor:")reference_out_fields=predicted_data["referenceOutFields"]predicted_out_fields=predicted_data["predictedOutFields"]reference_out_scalars=predicted_data["referenceOutScalars"]predicted_out_scalars=predicted_data["predictedOutScalars"]forsplit_name,split_indicesinproblem_split.items():forfnameinout_fields_names:ref_vect=np.array([])predict_vect=np.array([])fori,indexinenumerate(split_indices):ref=reference_out_fields[fname][index]pred=predicted_out_fields[fname][index]ref_vect=np.hstack((ref_vect,ref))predict_vect=np.hstack((predict_vect,pred))maxref=np.max(np.abs(ref))ifmaxref<tolerance:denom_field=1.else:denom_field=maxrefreldif=(pred-ref)/denom_fieldrel_SE_out_fields[split_name][fname][i]=(1/ref.shape[0])*(np.linalg.norm(reldif))**2r2OutFields[split_name][fname]=r2_score(ref_vect,predict_vect)forsnameinout_scalars_names:ref_scal=np.array([])predict_scal=np.array([])fori,indexinenumerate(split_indices):ref=reference_out_scalars[sname][index]pred=predicted_out_scalars[sname][index]ref_scal=np.hstack((ref_scal,ref))predict_scal=np.hstack((predict_scal,pred))# Compute relative differenceifref<tolerance:denom_scal=1.else:denom_scal=refreldif=(pred-ref)/denom_scalrel_SE_out_scalars[split_name][sname][i]=reldif**2r2OutScalars[split_name][sname]=r2_score(ref_scal,predict_scal)res={}ifverbose:print("===")print("rRMSE for fields")res["rRMSE for fields"]={}forsplit_name,split_indicesinproblem_split.items():res["rRMSE for fields"][split_name]={}ifverbose:print(" "+split_name)forfnameinout_fields_names:rel_RMSE_out_fields_set=np.sqrt(np.mean(rel_SE_out_fields[split_name][fname]))out_string="{:#.6g}".format(np.mean(rel_RMSE_out_fields_set))res["rRMSE for fields"][split_name][fname]=out_stringifverbose:print(fname.ljust(7)+": "+out_string)ifverbose:print("===")print("rRMSE for scalars")res["rRMSE for scalars"]={}forsplit_name,split_indicesinproblem_split.items():ifverbose:print(" "+split_name)res["rRMSE for scalars"][split_name]={}forsnameinout_scalars_names:rel_RMSE_out_scalars_set=np.sqrt(np.mean(rel_SE_out_scalars[split_name][sname]))out_string="{:#.6g}".format(np.mean(rel_RMSE_out_scalars_set))res["rRMSE for scalars"][split_name][sname]=out_stringifverbose:print(sname.ljust(14)+": "+out_string)ifverbose:print("===")print("R2 for fields")res["R2 for fields"]={}forsplit_name,split_indicesinproblem_split.items():ifverbose:print(" "+split_name)res["R2 for fields"][split_name]={}forfnameinout_fields_names:out_string="{:#.6g}".format(np.mean(r2OutFields[split_name][fname]))res["R2 for fields"][split_name][fname]=out_stringifverbose:print(fname.ljust(7)+": "+out_string)ifverbose:print("===")print("R2 for scalars")res["R2 for scalars"]={}forsplit_name,split_indicesinproblem_split.items():ifverbose:print(" "+split_name)res["R2 for scalars"][split_name]={}forsnameinout_scalars_names:out_string="{:#.6g}".format(np.mean(r2OutScalars[split_name][sname]))res["R2 for scalars"][split_name][sname]=out_stringifverbose:print(sname.ljust(14)+": "+out_string)withopen(generated_data_folder+os.sep+"metrics.yaml",'w')asfile:yaml.dump(res,file,default_flow_style=False,sort_keys=False)returnres
[docs]defexport_predictions(configuration:dict,problem:ProblemDefinition)->Dataset:zone_name=configuration["zone_name"]base_name=configuration["base_name"]verbose=configuration['verbose']# Clean previous plotsreset_folder(configuration["generated_data_folder"]+os.sep+configuration["case_name"]+"_predicted")# Load the problem and datasetoutFieldsNames=problem.out_fields_namesoutScalarsNames=problem.out_scalars_namesdataset=Dataset()dataset._load_from_dir_(configuration['init_dataset_location']+os.sep+"dataset",verbose=verbose)# Load the predicted fields data from chosen GPfile=open(configuration["generated_data_folder"]+os.sep+"allPredictedData.pkl",'rb')predictedData=pickle.load(file)file.close()predictedOutFields=predictedData["predictedOutFields"]predictedOutScalars=predictedData["predictedOutScalars"]exportOutFieldsNames=[n+"_predicted"forninoutFieldsNames]exportOutScalarsNames=[n+"_predicted"forninoutScalarsNames]ifconfiguration["regression"]["uncertainties"]:predictedOutFieldsVariance=predictedData["predictedOutFieldsVariance"]predictedOutFieldsQuantile0_025=predictedData["predictedOutFieldsQuantile0_025"]predictedOutFieldsQuantile0_975=predictedData["predictedOutFieldsQuantile0_975"]predictedOutScalarsVariance=predictedData["predictedOutScalarsVariance"]predictedOutScalarsQuantile0_025=predictedData["predictedOutScalarsQuantile0_025"]predictedOutScalarsQuantile0_975=predictedData["predictedOutScalarsQuantile0_975"]exportOutFieldsNames+=[n+"_variance"forninoutFieldsNames]+ \
[n+"_quantile_0.025"forninoutFieldsNames]+ \
[n+"_quantile_0.975"forninoutFieldsNames]exportOutScalarsNames+=[n+"_variance"forninoutScalarsNames]+ \
[n+"_quantile_0.025"forninoutScalarsNames]+ \
[n+"_quantile_0.975"forninoutScalarsNames]predicted_dataset=Dataset()ifverbose:print("Building predicted_dataset")fori_sampleintqdm(range(len(dataset)),disable=not(verbose)):sample=dataset[i_sample]# export fieldspredictedList=[predictedOutFields[fname][i_sample]forfnameinoutFieldsNames]pointFields=predictedListifconfiguration["regression"]["uncertainties"]:varianceList=[predictedOutFieldsVariance[fname][i_sample]forfnameinoutFieldsNames]q0_025List=[predictedOutFieldsQuantile0_025[fname][i_sample]forfnameinoutFieldsNames]q0_975List=[predictedOutFieldsQuantile0_975[fname][i_sample]forfnameinoutFieldsNames]pointFields+=varianceList+q0_025List+q0_975Listforj,fnameinenumerate(exportOutFieldsNames):sample.add_field(fname,pointFields[j],zone_name,base_name)# export scalarspredictedList=[predictedOutScalars[sname][i_sample]forsnameinoutScalarsNames]scalars=predictedListifconfiguration["regression"]["uncertainties"]:varianceList=[predictedOutScalarsVariance[sname][i_sample]forsnameinoutScalarsNames]q0_025List=[predictedOutScalarsQuantile0_025[sname][i_sample]forsnameinoutScalarsNames]q0_975List=[predictedOutScalarsQuantile0_975[sname][i_sample]forsnameinoutScalarsNames]scalars+=varianceList+q0_025List+q0_975Listforj,snameinenumerate(exportOutScalarsNames):sample.add_scalar(sname,scalars[j])predicted_dataset.add_sample(sample)predicted_dataset._save_to_dir_(configuration["generated_data_folder"]+os.sep+configuration["case_name"]+"_predicted/dataset",verbose=verbose)returnpredicted_dataset