static bool
_do_prediction(Context *ctx)
{
    char *result = "";
    float prediction;

    sml_variable_set_value(ctx->sml, ctx->offense1, ctx->val_offense1);
    sml_variable_set_value(ctx->sml, ctx->defense1, ctx->val_defense1);
    sml_variable_set_value(ctx->sml, ctx->offense2, ctx->val_offense2);
    sml_variable_set_value(ctx->sml, ctx->defense2, ctx->val_defense2);
    sml_variable_set_value(ctx->sml, ctx->winner, NAN);

    sml_predict(ctx->sml);
    ctx->reads++;
    prediction = roundf(sml_variable_get_value(ctx->sml, ctx->winner));

    if (!isnan(prediction)) {
        ctx->predictions++;
        if (ctx->val_winner == ((int)prediction)) {
            ctx->rights++;
            result = "right";
        } else
            result = "wrong";
    }

    printf("Game %d team 1 (%d, %d) x team2 (%d, %d): predicted winner: %.0f "
        "real winner: %d %s\n", ctx->reads,
        ctx->val_offense1, ctx->val_defense1, ctx->val_offense2,
        ctx->val_defense2, prediction, ctx->val_winner, result);


    return true;
}
static void
_output_state_changed_cb(struct sml_object *sml,
    struct sml_variables_list *changed, void *data)
{
    uint16_t i, j, len, changed_len, found = 0;
    struct sml_variable *var, *changed_var;
    struct sml_variables_list *list;
    Context *ctx = data;
    char var_name[SML_VARIABLE_NAME_MAX_LEN + 1];

    printf("SML Change State {");
    list = sml_get_output_list(sml);
    changed_len = sml_variables_list_get_length(sml, changed);
    len = sml_variables_list_get_length(sml, list);
    for (i = 0; i < len; i++) {
        var = sml_variables_list_index(sml, list, i);
        for (j = 0; j < changed_len; j++) {
            changed_var = sml_variables_list_index(sml, list, j);
            if (var == changed_var) {
                ctx->output_state_changed_outputs[i] = sml_variable_get_value(
                    sml, var);
                if (found++ > 0)
                    printf(", ");
                if (!sml_variable_get_name(sml, var, var_name,
                    sizeof(var_name)))
                    printf("%s: %f", var_name,
                        ctx->output_state_changed_outputs[i]);
            }
        }
    }
    printf("}\n");
}
static void
_output_state_changed_cb(struct sml_object *sml,
    struct sml_variables_list *changed, void *data)
{
    struct sml_variable *sml_var = sml_variables_list_index(sml, changed, 0);
    float new_value = sml_variable_get_value(sml, sml_var);

    _update_air_conditioner_power(data, new_value);
}
static void
output_state_changed_cb(struct sml_object *sml,
    struct sml_variables_list *changed, void *data)
{
    GList *itr;
    Context *ctx = data;
    float val;


    if (ctx->debug)
        printf("%i::output_state_changed_cb called.\n", ctx->read_counter - 1);

    for (itr = ctx->outputs; itr; itr = itr->next) {
        Variable *var = itr->data;
        val = sml_variable_get_value(sml, var->sml_var);
        if (!isnan(val))
            var->guess_value = val;
    }
}