%macro sia_centrality_msr_comp(sia_project_pk=,sia_wrkflw_step_id=); %let sia_proc_starttime = %sysfunc(datetime()); *** Input parameters **************************; %let sia_project_pk = &sia_project_pk.; %let sia_wrkflw_step_id = &sia_wrkflw_step_id.; *** Global parameters defined & declared in other macros *****; %let sia_apdm_lib = &sia_apdm_lib.; %let sia_bisdata_lib = &sia_bisdata_lib.; %let sia_imdata_lib = &sia_imdata_lib.; %let sia_bisdata_type = &sia_bisdata_type.; %let sia_bisdata_server = &sia_bisdata_server.; %let sia_execution_mode = &sia_execution_mode.; %let sia_hpa_grid_mode = &sia_hpa_grid_mode.; %let sia_prm_val_xctn_md_dstrbtd = &sia_prm_val_xctn_md_dstrbtd.; %let sia_prm_val_xctn_md_nndstrbtd = &sia_prm_val_xctn_md_nndstrbtd.; %let sia_grid_host = &sia_grid_host.; %let sia_grid_installloc = &sia_grid_installloc.; %let sia_prm_val_grph_drctd = &sia_prm_val_grph_drctd.; %let sia_prm_val_grph_undrctd = &sia_prm_val_grph_undrctd.; %let sia_src_data_graphdirtyp = &sia_src_data_graphdirtyp.; %let sia_sas_lib = &sia_sas_lib.; %let sia_wrkflw_status_exectd = &sia_wrkflw_status_exectd.; %let sia_wrkflw_status_error = &sia_wrkflw_status_error.; %let sia_wrkflw_status_enable = &sia_wrkflw_status_enable.; %let sia_wrkflw_status_disable = &sia_wrkflw_status_disable.; %let sia_smd_error_tbl = &sia_smd_error_tbl.; %let sia_smd_err_key =; %let sia_sql_ip_trace_flg = &sia_sql_ip_trace_flg.; /* Turning option sql_ip_trace on */ %if %kupcase("&sia_sql_ip_trace_flg.") eq "Y" %then %do; options SQL_IP_TRACE = ALL; %end; *** Workflow step IDs for steps: 1. Community Detection, 2. Centrality Measures and 3. Role Assignment ***; %let sia_wrkflw_step_id_cmbld = &sia_wrkflw_step_id_cmbld.; %let sia_wrkflw_step_id_cntrmsr = &sia_wrkflw_step_id_cntrmsr.; %let sia_wrkflw_step_id_rlass = &sia_wrkflw_step_id_rlass.; *** Proc Optgraph Global Parameters defined in sia_post_init.sas***; %let sia_po_graph_int_fmt = &sia_po_graph_int_fmt.; %let sia_po_loglevel = &sia_po_loglevel.; %let sia_po_nthreads = &sia_po_nthreads.; *** Global params for Centrality Measures Param Ids ***; %let SIA_PARAM_ID_COMPLVLTYP = &SIA_PARAM_ID_COMPLVLTYP.; %let SIA_PARAM_ID_GRAPHDIRTYP = &SIA_PARAM_ID_GRAPHDIRTYP.; /*%let SIA_PARAM_ID_CHKPGRNK = &SIA_PARAM_ID_CHKPGRNK.;*/ /*%let SIA_PARAM_ID_PGRNKALPHAVAL = &SIA_PARAM_ID_PGRNKALPHAVAL.;*/ %let SIA_PARAM_ID_CHKINFL = &SIA_PARAM_ID_CHKINFL.; %let SIA_PARAM_ID_CHKDEG = &SIA_PARAM_ID_CHKDEG.; %let SIA_PARAM_ID_DEGTYP = &SIA_PARAM_ID_DEGTYP.; %let SIA_PARAM_ID_CHKCLSN = &SIA_PARAM_ID_CHKCLSN.; %let SIA_PARAM_ID_CLSNNOPATHTYP = &SIA_PARAM_ID_CLSNNOPATHTYP.; %let SIA_PARAM_ID_CHKBTWN = &SIA_PARAM_ID_CHKBTWN.; %let SIA_PARAM_ID_BTWNNORMTYP = &SIA_PARAM_ID_BTWNNORMTYP.; %let SIA_PARAM_ID_CHKEIGEN = &SIA_PARAM_ID_CHKEIGEN.; %let SIA_PARAM_ID_EIGENALGOTYP = &SIA_PARAM_ID_EIGENALGOTYP.; %let SIA_PARAM_ID_CHKHUB = &SIA_PARAM_ID_CHKHUB.; %let SIA_PARAM_ID_CHKAUTH = &SIA_PARAM_ID_CHKAUTH.; %let SIA_PARAM_ID_CHKCLSCOEFF = &SIA_PARAM_ID_CHKCLSCOEFF.; *** Community Detection Param IDs (of Community Building Approach and Selected Resolution value)***; %let SIA_PARAM_ID_COMMBLDAPRCH = &SIA_PARAM_ID_COMMBLDAPRCH.; %let SIA_PARAM_ID_RESVALSELECTED = &SIA_PARAM_ID_RESVALSELECTED.; *** Community Building Approach Parameter Value Code for Bottom-Up Approach***; %let SIA_PARAM_VAL_CD_COMMBLD_BUA = &SIA_PARAM_VAL_CD_COMMBLD_BUA.; *** Centrality Measures Computation By Cluster/Network ***; %let SIA_BY_CLUSTER_COMM = &SIA_BY_CLUSTER_COMM.; *** UI Check Box Values ***; %let sia_chk_box_yes = &sia_chk_box_yes.; *** Text Separator ***; %let sia_text_separator = &sia_text_separator.; *** NAVL Value ***; %let sia_navl = &sia_navl.; *** Centrality Measures Precision (after decimal point) ***; %let sia_cm_round_precision = &sia_cm_round_precision.; *** Centrality Measures Code ***; /*%let sia_cm_cd_pgernk = &sia_cm_cd_pgernk.;*/ %let sia_cm_cd_inflnce1 = &sia_cm_cd_inflnce1.; %let sia_cm_cd_inflnce2 = &sia_cm_cd_inflnce2.; %let sia_cm_cd_dg = &sia_cm_cd_dg.; %let sia_cm_cd_dg_in = &sia_cm_cd_dg_in.; %let sia_cm_cd_dg_out = &sia_cm_cd_dg_out.; %let sia_cm_cd_close = &sia_cm_cd_close.; %let sia_cm_cd_close_in = &sia_cm_cd_close_in.; %let sia_cm_cd_close_out = &sia_cm_cd_close_out.; %let sia_cm_cd_between = &sia_cm_cd_between.; %let sia_cm_cd_eigen = &sia_cm_cd_eigen.; %let sia_cm_cd_auth = &sia_cm_cd_auth.; %let sia_cm_cd_hub = &sia_cm_cd_hub.; %let sia_cm_cd_clust_coef = &sia_cm_cd_clust_coef.; *** Error Handling if Work Flow Step ID is Null ***; %if &sia_wrkflw_step_id. eq %then %do; %let sia_smd_err_key = E_00013; *** Work Flow Step ID is Null ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; *** Updating Work Flow Status for Centrality Measures Step (IN PROGRESS) ***; proc sql noprint; update &sia_apdm_lib..project_wrkflw_step set WRKFLW_STEP_STATUS_CD = kupcase("&sia_wrkflw_status_inprgs.") where kupcase(ktrim(kleft(WRKFLW_STEP_ID))) = kupcase("&sia_wrkflw_step_id_cntrmsr.") and project_pk = &sia_project_pk.; quit; *** Error Handling if table updation failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00007; *** Table Updation Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; *** Get Centrality Measures Parameters from apdm.project_param table ***; %let SIA_COMPLVLTYP =&sia_navl.; %let SIA_GRAPHDIRTYP =&sia_navl.; %let SIA_CHKPGRNK =&sia_navl.; %let SIA_PGRNKALPHAVAL =&sia_navl.; %let SIA_CHKINFL =&sia_navl.; %let SIA_CHKDEG =&sia_navl.; %let SIA_DEGTYP =&sia_navl.; %let SIA_CHKCLSN =&sia_navl.; %let SIA_CLSNNOPATHTYP =&sia_navl.; %let SIA_CHKBTWN =&sia_navl.; %let SIA_BTWNNORMTYP =&sia_navl.; %let SIA_CHKEIGEN =&sia_navl.; %let SIA_EIGENALGOTYP =&sia_navl.; %let SIA_CHKHUB =&sia_navl.; %let SIA_CHKAUTH =&sia_navl.; %let SIA_CHKCLSCOEFF =&sia_navl.; %let SIA_COMMBLDAPRCH =&sia_navl.; %let SIA_RESVALSELECTED =&sia_navl.; %let sia_param_val_var_list = SIA_COMPLVLTYP/SIA_GRAPHDIRTYP/SIA_CHKPGRNK/SIA_PGRNKALPHAVAL/SIA_CHKINFL/SIA_CHKDEG/ SIA_DEGTYP/SIA_CHKCLSN/SIA_CLSNNOPATHTYP/SIA_CHKBTWN/SIA_BTWNNORMTYP/SIA_CHKEIGEN/ SIA_EIGENALGOTYP/SIA_CHKHUB/SIA_CHKAUTH/SIA_CHKCLSCOEFF/SIA_COMMBLDAPRCH/SIA_RESVALSELECTED ; %let sia_param_id_list = &SIA_PARAM_ID_COMPLVLTYP./&SIA_PARAM_ID_GRAPHDIRTYP./&SIA_PARAM_ID_CHKPGRNK./&SIA_PARAM_ID_PGRNKALPHAVAL./ &SIA_PARAM_ID_CHKINFL./&SIA_PARAM_ID_CHKDEG./&SIA_PARAM_ID_DEGTYP./&SIA_PARAM_ID_CHKCLSN./ &SIA_PARAM_ID_CLSNNOPATHTYP./&SIA_PARAM_ID_CHKBTWN./&SIA_PARAM_ID_BTWNNORMTYP./&SIA_PARAM_ID_CHKEIGEN./ &SIA_PARAM_ID_EIGENALGOTYP./&SIA_PARAM_ID_CHKHUB./&SIA_PARAM_ID_CHKAUTH./&SIA_PARAM_ID_CHKCLSCOEFF./ &SIA_PARAM_ID_COMMBLDAPRCH./&SIA_PARAM_ID_RESVALSELECTED. ; %do sia_mac_i=1 %to 18; %let sia_mac_var&sia_mac_i. = %sysfunc(scan(&sia_param_val_var_list.,&sia_mac_i.,"/")); %let sia_param_id&sia_mac_i. = %sysfunc(scan(&sia_param_id_list.,&sia_mac_i.,"/")); %if &sia_mac_i. < 17 %then %do; %let sia_wrkflw_step_id = &sia_wrkflw_step_id.; %end; %else %do; %let sia_wrkflw_step_id = &sia_wrkflw_step_id_cmbld.; %end; proc sql noprint; select case when kupcase(ktrim(kleft(param_predefined_value))) = kupcase("&sia_navl.") then param_userdefined_value else param_predefined_value end into :&&sia_mac_var&sia_mac_i. from &sia_apdm_lib..project_param where project_pk = &sia_project_pk. and kupcase(ktrim(kleft(wrkflw_step_id))) = kupcase("&sia_wrkflw_step_id.") and kupcase(ktrim(kleft(param_id))) = kupcase("&&sia_param_id&sia_mac_i."); quit; *** Error Handling If Data Selection from Table Failed***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %end; %let SIA_COMPLVLTYP =&SIA_COMPLVLTYP.; %let SIA_GRAPHDIRTYP =&SIA_GRAPHDIRTYP.; %let SIA_CHKPGRNK =&SIA_CHKPGRNK.; %let SIA_PGRNKALPHAVAL =&SIA_PGRNKALPHAVAL.; %let SIA_CHKINFL =&SIA_CHKINFL.; %let SIA_CHKDEG =&SIA_CHKDEG.; %let SIA_DEGTYP =&SIA_DEGTYP.; %let SIA_CHKCLSN =&SIA_CHKCLSN.; %let SIA_CLSNNOPATHTYP =&SIA_CLSNNOPATHTYP.; %let SIA_CHKBTWN =&SIA_CHKBTWN.; %let SIA_BTWNNORMTYP =&SIA_BTWNNORMTYP.; %let SIA_CHKEIGEN =&SIA_CHKEIGEN.; %let SIA_EIGENALGOTYP =&SIA_EIGENALGOTYP.; %let SIA_CHKHUB =&SIA_CHKHUB.; %let SIA_CHKAUTH =&SIA_CHKAUTH.; %let SIA_CHKCLSCOEFF =&SIA_CHKCLSCOEFF.; %let SIA_COMMBLDAPRCH =&SIA_COMMBLDAPRCH.; %let SIA_RESVALSELECTED =&SIA_RESVALSELECTED.; *** If Business database not in SAS and execution mode is SMP the Community Detection output would be written in SAS Librray on Client Machine otherwise in Business data library on client machine or on remote data server. ***; %if %kupcase("&sia_bisdata_type.") ne "SAS" AND %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_nndstrbtd.") %then %do; %let sia_dynamic_bisdata_lib = &sia_sas_lib.; %let sia_dynamic_imdata_lib = &sia_sas_lib.; %end; %else %do; %let sia_dynamic_bisdata_lib = &sia_bisdata_lib.; %let sia_dynamic_imdata_lib = &sia_imdata_lib.; %end; *** Setting Grid Server related parameters required for DISTRIBUTED mode of execution ***; %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; option set=GRIDHOST ="&sia_grid_host."; option set=GRIDINSTALLLOC="&sia_grid_installloc."; option set=GRIDDATASERVER="&sia_bisdata_server."; option set=GRIDMODE = "&sia_hpa_grid_mode."; ** Checking whether HPA-Grid is UP or not **; proc hpatest data=&sia_dynamic_bisdata_lib..cla_cd_p6_&sia_project_pk.; performance nodes=ALL; run; *** Error Handling If HPA-Grid is Down ***; %sia_err_chk(type=DATA); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00039; *** HPA-Grid is Down ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %end; *** Get level value for selected resolution list on which Communities have been built ***; proc sql noprint; select level into :sia_comm_level from &sia_dynamic_bisdata_lib..cla_cd_p3_&sia_project_pk. %if %kupcase("&SIA_COMMBLDAPRCH.") eq %kupcase("&SIA_PARAM_VAL_CD_COMMBLD_BUA.") %then %do; where resolution = &SIA_RESVALSELECTED. %end; ; quit; *** Error Handling If Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_comm_level = &sia_comm_level.; *** Deleting Optgraph Generated output datasets if allready exists ***; proc sql noprint; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i1_&sia_project_pk.; drop table &sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i3_&sia_project_pk.; drop table &sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i5_&sia_project_pk.; drop table &sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i7_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i7_&sia_project_pk.; %end; quit; /******************************************************************************************************** * * * CENTRALITY MEASURES COMPUTATION IF SOURCE LINK DATA IS 'DIRECTED'. * * * ********************************************************************************************************/ %if %kupcase("&sia_src_data_graphdirtyp.") eq %kupcase("&sia_prm_val_grph_drctd.") %then %do; /************************************************************************************************************ * Centrality Measures Computation – 1.Influence, 2.Degree, 3.Clustering-Coefficient, 4. Hub, 5.Authority * ************************************************************************************************************/ *** Get source Links Dataset for data_links option in proc optgraph processing further ***; %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_nndstrbtd.") %then %do; %let sia_main_data_lnks = &sia_dynamic_bisdata_lib..cla_lnf_p1_&sia_project_pk.; %end; %else %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; %let sia_main_data_lnks = &sia_dynamic_bisdata_lib..cla_cd_p6_&sia_project_pk.; %end; %let sia_main_data_lnks = &sia_main_data_lnks.; *** Checking whether Source data is empty ***; /* i18NOK:Begin */ *** Count() function here can not be internationalized. ***; proc sql noprint; select count(*) into :sia_src_data_rec_cnt from &sia_main_data_lnks.; quit; /* i18NOK:End */ *** Error Handling If Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_src_data_rec_cnt = &sia_src_data_rec_cnt.; *** Error Handling If Source Data is Empty ***; %if %sysevalf(&sia_src_data_rec_cnt. < 1) %then %do; %let sia_smd_err_key = E_00032; *** Source Data is Empty ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; proc optgraph internal_format = &sia_po_graph_int_fmt. loglevel = &sia_po_loglevel. direction = DIRECTED data_links = &sia_main_data_lnks. %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_nndstrbtd.") %then %do; data_nodes = &sia_dynamic_bisdata_lib..cla_cd_p1_&sia_project_pk.(rename = (community_&sia_comm_level. = cluster)) %end; out_nodes = &sia_dynamic_imdata_lib..cla_cm_i1_&sia_project_pk. ; performance nthreads = &sia_po_nthreads. ; centrality %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; check_data = no %end; degree = &SIA_DEGTYP. influence = weight %if %kupcase("&SIA_CHKCLSCOEFF.") eq %kupcase("&sia_chk_box_yes.") %then %do; clustering_coef %end; %if %kupcase("&SIA_CHKHUB.") eq %kupcase("&sia_chk_box_yes.") %then %do; hub = weight %end; %if %kupcase("&SIA_CHKAUTH.") eq %kupcase("&sia_chk_box_yes.") %then %do; auth = weight %end; %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") OR %kupcase("&SIA_COMPLVLTYP.") eq %kupcase("&SIA_BY_CLUSTER_COMM.") %then %do; by_cluster %end; ; data_links_var from = from_entity_id to = to_entity_id weight = link_weight_val ; run; *** Error Handling if Centrality Measures Computation failed ***; %sia_err_chk(type=DATA); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00028; *** Centrality Measures Computation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; *** Geting Maximum values of Influence Centralities to normalize it with formula Normalized Value = Actual Value/Maximum Value ***; %let sia_influence1_max_val =.; %let sia_influence2_max_val =.; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql noprint; select max(centr_influence1_wt), max(centr_influence2_wt) into :sia_influence1_max_val, :sia_influence2_max_val from &sia_dynamic_imdata_lib..cla_cm_i1_&sia_project_pk.; quit; *** Error Handling If Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_influence1_max_val = &sia_influence1_max_val.; %let sia_influence2_max_val = &sia_influence2_max_val.; *** Renaming Columns of Centrality Output table ***; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql noprint; create table &sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk. as select node %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") OR %kupcase("&SIA_COMPLVLTYP.") eq %kupcase("&SIA_BY_CLUSTER_COMM.") %then %do; ,cluster %end; ,centr_influence1_wt/&sia_influence1_max_val. as &sia_cm_cd_inflnce1. ,centr_influence2_wt/&sia_influence2_max_val. as &sia_cm_cd_inflnce2. %if %kupcase("&SIA_DEGTYP.") eq "BOTH" %then %do; ,centr_degree as &sia_cm_cd_dg. ,centr_degree_in as &sia_cm_cd_dg_in. ,centr_degree_out as &sia_cm_cd_dg_out. %end; %else %if %kupcase("&SIA_DEGTYP.") eq "IN" %then %do; ,centr_degree_in as &sia_cm_cd_dg_in. %end; %else %if %kupcase("&SIA_DEGTYP.") eq "OUT" %then %do; ,centr_degree_out as &sia_cm_cd_dg_out. %end; %if %kupcase("&SIA_CHKCLSCOEFF.") eq %kupcase("&sia_chk_box_yes.") %then %do; ,centr_cluster as &sia_cm_cd_clust_coef. %end; %if %kupcase("&SIA_CHKHUB.") eq %kupcase("&sia_chk_box_yes.") %then %do; ,centr_hub_wt as &sia_cm_cd_hub. %end; %if %kupcase("&SIA_CHKAUTH.") eq %kupcase("&sia_chk_box_yes.") %then %do; ,centr_auth_wt as &sia_cm_cd_auth. %end; from &sia_dynamic_imdata_lib..cla_cm_i1_&sia_project_pk.; quit; *** Error Handling if Table Creation failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00009; *** Table Creation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; /************************************************************************ * Centrality Measures Computation – 6.Eigen Vector * ************************************************************************/ %if %kupcase("&SIA_CHKEIGEN.") eq %kupcase("&sia_chk_box_yes.") %then %do; /* If execution mode is in Distributed environment then create source link data to be used in Eigen Computation having Community IDs of each undirected link */ %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; %if %sysfunc(exist(&sia_dynamic_bisdata_lib..cla_cm_p1_&sia_project_pk.)) = 1 %then %do; proc sql noprint; drop table &sia_dynamic_bisdata_lib..cla_cm_p1_&sia_project_pk.; quit; %end; options dbidirectexec; proc sql noprint; create table &sia_dynamic_bisdata_lib..cla_cm_p1_&sia_project_pk. as select a.cluster, b.from_entity_id, b.to_entity_id, b.link_weight_val from &sia_dynamic_bisdata_lib..cla_cd_p5_&sia_project_pk. a, &sia_dynamic_bisdata_lib..cla_lnf_p2_&sia_project_pk. b where a.from_entity_id = b.from_entity_id and a.to_entity_id = b.to_entity_id ; quit; *** Error Handling If Table Creation Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00009; *** Table Creation Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_main_data_lnks = &sia_dynamic_bisdata_lib..cla_cm_p1_&sia_project_pk.; %end; %else %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_nndstrbtd.") %then %do; %let sia_main_data_lnks = &sia_dynamic_bisdata_lib..cla_lnf_p2_&sia_project_pk.; %end; *** Checking whether Source data is empty ***; /* i18NOK:Begin */ *** Count() function here can not be internationalized. ***; proc sql noprint; select count(*) into :sia_src_data_rec_cnt from &sia_main_data_lnks.; quit; /* i18NOK:End */ *** Error Handling If Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_src_data_rec_cnt = &sia_src_data_rec_cnt.; *** Error Handling If Source Data is Empty ***; %if %sysevalf(&sia_src_data_rec_cnt. < 1) %then %do; %let sia_smd_err_key = E_00032; *** Source Data is Empty ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; proc optgraph internal_format = &sia_po_graph_int_fmt. loglevel = &sia_po_loglevel. direction = UNDIRECTED data_links = &sia_main_data_lnks. %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_nndstrbtd.") %then %do; data_nodes = &sia_dynamic_bisdata_lib..cla_cd_p1_&sia_project_pk.(rename = (community_&sia_comm_level. = cluster)) %end; out_nodes = &sia_dynamic_imdata_lib..cla_cm_i3_&sia_project_pk. ; performance nthreads = &sia_po_nthreads. ; centrality %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; check_data = no %end; eigen = weight eigen_algorithm = &SIA_EIGENALGOTYP. %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") OR %kupcase("&SIA_COMPLVLTYP.") eq %kupcase("&SIA_BY_CLUSTER_COMM.") %then %do; by_cluster %end; ; data_links_var from = from_entity_id to = to_entity_id weight = link_weight_val ; run; *** Error Handling if Centrality Measures Computation failed ***; %sia_err_chk(type=DATA); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00028; *** Centrality Measures Computation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; *** Renaming Columns of Centrality Output table ***; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql noprint; create table &sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk. as select node, centr_eigen_wt as &sia_cm_cd_eigen. from &sia_dynamic_imdata_lib..cla_cm_i3_&sia_project_pk.; quit; *** Error Handling if Table Creation failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00009; *** Table Creation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %end; /**************************************************************************** * Centrality Measures Computation – 7.Closeness, 8.Betweenness * ****************************************************************************/ %if %kupcase("&SIA_CHKCLSN.") eq %kupcase("&sia_chk_box_yes.") or %kupcase("&SIA_CHKBTWN.") eq %kupcase("&sia_chk_box_yes.") %then %do; *** Need to inverse weight variable for Weighted Betweeness and Closeness metrics ***; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql noprint; create table &sia_dynamic_imdata_lib..cla_cm_i7_&sia_project_pk. as select %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; cluster, %end; from_entity_id, to_entity_id, 1/link_weight_val as link_weight_val from &sia_main_data_lnks.; quit; %let sia_clns_btw_data_lnks = &sia_dynamic_imdata_lib..cla_cm_i7_&sia_project_pk.; proc optgraph internal_format = &sia_po_graph_int_fmt. loglevel = &sia_po_loglevel. direction = DIRECTED data_links = &sia_clns_btw_data_lnks. %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_nndstrbtd.") %then %do; data_nodes = &sia_dynamic_bisdata_lib..cla_cd_p1_&sia_project_pk.(rename = (community_&sia_comm_level. = cluster)) %end; out_nodes = &sia_dynamic_imdata_lib..cla_cm_i5_&sia_project_pk. ; performance nthreads = &sia_po_nthreads. ; centrality %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") %then %do; check_data = no %end; %if %kupcase("&SIA_CHKBTWN.") eq %kupcase("&sia_chk_box_yes.") %then %do; between = weight between_norm = &SIA_BTWNNORMTYP. %end; %if %kupcase("&SIA_CHKCLSN.") eq %kupcase("&sia_chk_box_yes.") %then %do; close = weight close_nopath = &SIA_CLSNNOPATHTYP. %end; by_cluster ; data_links_var from = from_entity_id to = to_entity_id weight = link_weight_val ; run; *** Error Handling if Centrality Measures Computation failed ***; %sia_err_chk(type=DATA); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00028; *** Centrality Measures Computation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; *** Geting Maximum values of Closeness Centralities to normalize it with formula Normalized Value = Actual Value/Maximum Value ***; %if %kupcase("&SIA_CHKCLSN.") eq %kupcase("&sia_chk_box_yes.") %then %do; %let sia_close_max_val =.; %let sia_closein_max_val =.; %let sia_closeout_max_val =.; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql noprint; select max(centr_close_wt), max(centr_close_in_wt), max(centr_close_out_wt) into :sia_close_max_val, :sia_closein_max_val, :sia_closeout_max_val from &sia_dynamic_imdata_lib..cla_cm_i5_&sia_project_pk.; quit; *** Error Handling If Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_close_max_val = &sia_close_max_val.; %let sia_closein_max_val = &sia_closein_max_val.; %let sia_closeout_max_val = &sia_closeout_max_val.; %end; *** Renaming Columns of Centrality Output table ***; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql noprint; create table &sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk. as select node %if %kupcase("&SIA_CHKBTWN.") eq %kupcase("&sia_chk_box_yes.") %then %do; ,centr_between_wt as &sia_cm_cd_between. %end; %if %kupcase("&SIA_CHKCLSN.") eq %kupcase("&sia_chk_box_yes.") %then %do; ,centr_close_wt/&sia_close_max_val. as &sia_cm_cd_close. ,centr_close_in_wt/&sia_closein_max_val. as &sia_cm_cd_close_in. ,centr_close_out_wt/&sia_closeout_max_val. as &sia_cm_cd_close_out. %end; from &sia_dynamic_imdata_lib..cla_cm_i5_&sia_project_pk.; quit; *** Error Handling if Table Creation failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00009; *** Table Creation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %end; %end; *** Deleting NodeCentMeasuresAll_&sia_project_pk. dataset if allready exists ***; proc sql noprint; %if %sysfunc(exist(&sia_dynamic_bisdata_lib..cla_cm_p2_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_bisdata_lib..cla_cm_p2_&sia_project_pk.; %end; quit; *** Merge All Centrality Measures Datasets to get one dataset with all Measures of All Nodes ***; %if %kupcase("&sia_bisdata_type.") ne "SAS" %then %do; options dbidirectexec; %end; proc sql; create table &sia_dynamic_bisdata_lib..cla_cm_p2_&sia_project_pk. as select %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk.)) = 1 %then %do; a.node %if %kupcase("&sia_execution_mode.") eq %kupcase("&sia_prm_val_xctn_md_dstrbtd.") OR %kupcase("&SIA_COMPLVLTYP.") eq %kupcase("&SIA_BY_CLUSTER_COMM.") %then %do; , a.cluster %end; %else %do; , b.community_&sia_comm_level. as cluster %end; , a.&sia_cm_cd_inflnce1. , a.&sia_cm_cd_inflnce2. %if %kupcase("&SIA_DEGTYP.") eq "BOTH" %then %do; , a.&sia_cm_cd_dg. , a.&sia_cm_cd_dg_in. , a.&sia_cm_cd_dg_out. %end; %else %if %kupcase("&SIA_DEGTYP.") eq "IN" %then %do; , a.&sia_cm_cd_dg_in. %end; %else %if %kupcase("&SIA_DEGTYP.") eq "OUT" %then %do; , a.&sia_cm_cd_dg_out. %end; %if %kupcase("&SIA_CHKCLSCOEFF.") eq %kupcase("&sia_chk_box_yes.") %then %do; , a.&sia_cm_cd_clust_coef. %end; %if %kupcase("&SIA_CHKHUB.") eq %kupcase("&sia_chk_box_yes.") %then %do; , a.&sia_cm_cd_hub. %end; %if %kupcase("&SIA_CHKAUTH.") eq %kupcase("&sia_chk_box_yes.") %then %do; , a.&sia_cm_cd_auth. %end; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.)) = 1 %then %do; , c.&sia_cm_cd_eigen. %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.)) = 1 %then %do; %if %kupcase("&SIA_CHKBTWN.") eq %kupcase("&sia_chk_box_yes.") %then %do; , d.&sia_cm_cd_between. /* i18NOK:Line */ %end; %if %kupcase("&SIA_CHKCLSN.") eq %kupcase("&sia_chk_box_yes.") %then %do; , coalesce(d.&sia_cm_cd_close.,0) as &sia_cm_cd_close. /* i18NOK:Line */ , coalesce(d.&sia_cm_cd_close_in.,0) as &sia_cm_cd_close_in. /* i18NOK:Line */ , coalesce(d.&sia_cm_cd_close_out.,0) as &sia_cm_cd_close_out. /* i18NOK:Line */ %end; %end; from &sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk. a %if %kupcase("&sia_execution_mode.") ne %kupcase("&sia_prm_val_xctn_md_dstrbtd.") AND %kupcase("&SIA_COMPLVLTYP.") ne %kupcase("&SIA_BY_CLUSTER_COMM.") %then %do; , &sia_dynamic_bisdata_lib..cla_cd_p1_&sia_project_pk. b %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.)) = 1 %then %do; , &sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk. c %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.)) = 1 %then %do; , &sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk. d %end; where %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.)) = 1 %then %do; a.node = c.node and %end; %if %kupcase("&sia_execution_mode.") ne %kupcase("&sia_prm_val_xctn_md_dstrbtd.") AND %kupcase("&SIA_COMPLVLTYP.") ne %kupcase("&SIA_BY_CLUSTER_COMM.") %then %do; a.node = b.node and %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.)) = 1 %then %do; a.node = d.node and %end; 1 = 1 ; quit; *** Error Handling if Table Creation failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00009; *** Table Creation failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; /******************************************************************************************************** * CENTRALITY MEASURES GRAPH DATA PREPARATION * * * * 1.Influence(1&2), 2.Degree(in/out/both), 3.Closeness, 4.Betweenness, 5.Eigen Vector, * * 6.Authority, 7.Hub, and 8.Clustering Coefficient * ********************************************************************************************************/ *** Geting Current Project Run Num ***; proc sql noprint; select project_curr_run_num into :sia_prjct_curr_run_num from &sia_apdm_lib..project where project_pk = &sia_project_pk.; quit; *** Error Handling if Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_prjct_curr_run_num = &sia_prjct_curr_run_num.; *** Deleting cla_cm_i8_&sia_project_pk. dataset if allready exists ***; proc sql noprint; %if %sysfunc(exist(&sia_sas_lib..cla_cm_i8_&sia_project_pk.)) = 1 %then %do; drop table &sia_sas_lib..cla_cm_i8_&sia_project_pk.; %end; quit; *** Geting List of Centrality Measures computed (Count and variable names) ***; proc contents data = &sia_dynamic_bisdata_lib..cla_cm_p2_&sia_project_pk. out = &sia_sas_lib..cla_cm_i8_&sia_project_pk.(keep=name where=(kupcase(name) not in ("CLUSTER","NODE"))); run; *** Error Handling if Getting list of Variables for Computed Centrality Measures Failed ***; %sia_err_chk(type=DATA); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00029; *** Getting list of Variables for Computed Centrality Measures Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; /* i18NOK:Begin */ *** Count() function here can not be internationalized. ***; proc sql noprint; select count(name), name into :sia_cm_vars_cnt, :sia_cm_vars_nm separated by "&sia_text_separator." from &sia_sas_lib..cla_cm_i8_&sia_project_pk.; quit; /* i18NOK:End */ *** Error Handling if Data Selection from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00015; *** Data Selection from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %let sia_cm_vars_cnt = &sia_cm_vars_cnt.; %let sia_cm_vars_nm = &sia_cm_vars_nm.; *** Delete Records from project_centrality_statistics for current project and run number before inserting fresh records ***; proc sql noprint; delete from &sia_apdm_lib..project_centrality_statistics where project_pk = &sia_project_pk. and project_curr_run_num = &sia_prjct_curr_run_num.; quit; *** Error Handling if Data Deletion from Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00018; *** Data Deletion from Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; *** Inserting Records into Reporting Table for Each Computed Centrality Measures ***; %do sia_i=1 %to &sia_cm_vars_cnt.; %let sia_cm_var&sia_i. = %sysfunc(scan(&sia_cm_vars_nm.,&sia_i.,&sia_text_separator.)); %let sia_cm_cd = &&sia_cm_var&sia_i.; %let sia_cm_var = &&sia_cm_var&sia_i.; /* i18NOK:Begin */ *** Count() function here can not be internationalized. ***; proc sql noprint; insert into &sia_apdm_lib..project_centrality_statistics select &sia_project_pk. as project_pk, &sia_prjct_curr_run_num. as project_curr_run_num, %kupcase("&sia_cm_cd.") as centrality_cd, round(&sia_cm_var.,&sia_cm_round_precision.) as centrality_value, count(round(&sia_cm_var.,&sia_cm_round_precision.)) as centrality_value_node_cnt from &sia_dynamic_bisdata_lib..cla_cm_p2_&sia_project_pk.(keep=&sia_cm_var.) group by centrality_value; quit; /* i18NOK:End */ *** Error Handling if Data Insertion into Table Failed ***; %sia_err_chk(type=SQL); %if %sysevalf(&sia_err_cd. > 4) %then %do; %let sia_smd_err_key = E_00002; *** Data Insertion into Table Failed ***; %put %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_err_key., NOQUOTE)); %goto exit; %end; %end; /************************************************************************************************ * COMPUTING DESCRIPTIVE STATISTICS OF ALL CMs TO BE SHOWN ON ROLE ASSIGNMENT SCREEN * ************************************************************************************************/ %sia_role_assign_cm_desc_stat(sia_project_pk=&sia_project_pk.); %exit: /************************************************************************************************ * Deleting Intermediate temporary tables * ************************************************************************************************/ proc sql noprint; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i1_&sia_project_pk.; drop table &sia_dynamic_imdata_lib..cla_cm_i2_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i3_&sia_project_pk.; drop table &sia_dynamic_imdata_lib..cla_cm_i4_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i7_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i7_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.)) = 1 %then %do; drop table &sia_dynamic_imdata_lib..cla_cm_i5_&sia_project_pk.; drop table &sia_dynamic_imdata_lib..cla_cm_i6_&sia_project_pk.; %end; %if %sysfunc(exist(&sia_sas_lib..cla_cm_i8_&sia_project_pk.)) = 1 %then %do; drop table &sia_sas_lib..cla_cm_i8_&sia_project_pk.; %end; quit; /************************************************************************************************ * UPDATING WORK FLOW STEP STATUS * ************************************************************************************************/ %if &sia_smd_err_key. eq %then %do; %let sia_cntrmsr_step_status = &sia_wrkflw_status_exectd.; %let sia_rlass_step_status = &sia_wrkflw_status_enable.; %end; %else %do; %let sia_cntrmsr_step_status = &sia_wrkflw_status_error.; %let sia_rlass_step_status = &sia_wrkflw_status_disable.; %end; proc sql noprint; update &sia_apdm_lib..project_wrkflw_step set wrkflw_step_status_cd = kupcase("&sia_cntrmsr_step_status.") where kupcase(ktrim(kleft(wrkflw_step_id))) = kupcase("&sia_wrkflw_step_id_cntrmsr.") and project_pk = &sia_project_pk.; update &sia_apdm_lib..project_wrkflw_step set wrkflw_step_status_cd = kupcase("&sia_rlass_step_status.") where kupcase(ktrim(kleft(wrkflw_step_id))) = kupcase("&sia_wrkflw_step_id_rlass.") and project_pk = &sia_project_pk.; quit; /************************************************************************************************ * COMPUTING PROCESSING TIME * ************************************************************************************************/ %let sia_smd_msg_key_strt = MSG_00001; %let sia_timestamp_msg_strt = %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_msg_key_strt., NOQUOTE)); %let sia_smd_msg_key_end = MSG_00002; %let sia_timestamp_msg_end = %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_msg_key_end., NOQUOTE)); %let sia_smd_msg_key_tot = MSG_00003; %let sia_timestamp_msg_tot = %sysfunc(sasmsg(sashelp.&sia_smd_error_tbl., &sia_smd_msg_key_tot., NOQUOTE)); %let sia_proc_endtime = %sysfunc(datetime()); %let sia_proc_exectime = %sysevalf((&sia_proc_endtime.-&sia_proc_starttime.)/60); data _null_; starttime = put(&sia_proc_starttime.,nldatm.); endtime = put(&sia_proc_endtime.,nldatm.); put "&sia_timestamp_msg_strt. " starttime "| &sia_timestamp_msg_end. " endtime ; put "&sia_timestamp_msg_tot. &sia_proc_exectime."; run; %mend sia_centrality_msr_comp;