ADAPT / src / scan_utility.c
scan_utility.c
Raw
#include "scan_utility.h"



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#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;i<scan_utility->num_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);
}