#include "scan_utility.h" #include #include #include #include "mape_k.h" #include "arc_model.h" #include "scan_scoring.h" #include "scan_repertoire.h" #include "timestamp.h" static void enum_to_arc_value(int enum_value, struct arc_value *value) { value->type = V_INT; value->v_int = enum_value; } void scan_utility_init(struct knowledge_base *k_b) { struct utility_decision *scan_utility = malloc(sizeof(struct utility_decision)); utility_decision_init(scan_utility,4); utility_decision_add_concern(scan_utility, "ScanRange", 0.25, scan_range_utility); utility_decision_add_concern(scan_utility, "ScanTargets",0.25, scan_targets_utility); utility_decision_add_concern(scan_utility, "ScanDuration", 0.25, scan_duration_utility); utility_decision_add_concern(scan_utility, "ScanComplexity", 0.25, scan_complexity_utility); struct named_res *t_u_res = malloc(sizeof(struct named_res)); named_res_init(t_u_res, "ScanUtility", 1, scan_utility); knowledge_base_add_res(k_b, t_u_res); } void scan_utility(struct analysis *a) { timestamp("[","] "); printf("[Utility] Scans [Start]\n"); struct knowledge_base *k_b = &a->az->mape_k->k_b; struct scan_repertoire *s_r= knowledge_base_get_res(k_b, "ScanRepertoire"); struct utility_decision *scan_utility = knowledge_base_get_res(k_b,"ScanUtility");; //Scan utility does not change over time, so we only need to do this once really. if(scan_utility->num_alternatives == 0) { for(size_t i=0; i < s_r->num_scans; i++) { struct scan *sc = &s_r->scans[i]; struct arc_value scan_values[scan_utility->num_concerns]; enum_to_arc_value(sc->s_r, &scan_values[0]); enum_to_arc_value(sc->s_t, &scan_values[1]); enum_to_arc_value(sc->s_d, &scan_values[2]); enum_to_arc_value(sc->s_c, &scan_values[3]); utility_decision_add_option(scan_utility,sc->name,scan_values,scan_utility->num_concerns); } utility_decision_rank(scan_utility); } for(int i=0;inum_alternatives;i++) { printf("%s:%lg\n",scan_utility->options[i].name, scan_utility->options[i].utility); } timestamp("[","] "); printf("[Utility] Scans [Complete]\n"); analysis_set_status(a, ANALYSIS_DONE); a->done(a); }