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;
}