static bool _sml_ann_bridge_calculate_confidence_interval(struct sml_ann_bridge *iann, struct sml_variables_list *inputs, unsigned int observations) { unsigned int i, j, inputs_len; float mean, sd, value; struct sml_variable *var; Confidence_Interval *ci; char var_name[SML_VARIABLE_NAME_MAX_LEN + 1]; sml_debug("Calculating confidence interval"); inputs_len = sml_ann_variables_list_get_length(inputs); for (i = 0; i < inputs_len; i++) { mean = sd = 0.0; var = sml_ann_variables_list_index(inputs, i); ci = sol_vector_append(&iann->confidence_intervals); if (!ci) { sml_critical("Could not alloc the Confidence_Interval"); goto err_exit; } for (j = 0; j < observations; j++) { value = sml_ann_variable_get_value_by_index(var, j); if (isnan(value)) sml_ann_variable_get_range(var, &value, NULL); mean += value; } mean /= observations; //Now the standard deviation for (j = 0; j < observations; j++) { value = sml_ann_variable_get_value_by_index(var, j); if (isnan(value)) sml_ann_variable_get_range(var, &value, NULL); sd += pow(value - mean, 2.0); } sd /= observations; sd = sqrt(sd); //Confidence interval of 95% ci->lower_limit = mean - (1.96 * (sd / sqrt(observations))); ci->upper_limit = mean + (1.96 * (sd / sqrt(observations))); iann->ci_length_sum += (ci->upper_limit - ci->lower_limit); if (sml_ann_variable_get_name(var, var_name, sizeof(var_name))) { sml_warning("Failed to get variable name for %p", var); continue; } sml_debug("Variable:%s mean:%f sd:%f lower:%f upper:%f", var_name, mean, sd, ci->lower_limit, ci->upper_limit); } return true; err_exit: sol_vector_clear(&iann->confidence_intervals); return false; }
static float _sml_ann_bridge_get_variable_value(struct sml_variables_list *list, uint16_t i, bool scale) { struct sml_variable *var = sml_ann_variables_list_index(list, i); float v = sml_ann_variable_get_value(var); if (isnan(v)) sml_ann_variable_get_range(var, &v, NULL); if (scale) return sml_ann_variable_scale_value(var, v); return v; }