/* * Perform final training and reset neural net. */ static void ai_game_over(game *g, int who) { double result[2]; /* Check for win */ if (g->p[who].crystals) { /* Compute margin of victory */ result[who] = .5 + g->p[who].crystals * 0.1; /* Check for instant win */ if (g->p[who].instant_win) result[who] = 1.0; } else { /* Compute margin of defeat */ result[who] = .5 - g->p[!who].crystals * 0.1; /* Check for instant loss */ if (g->p[!who].instant_win) result[who] = 0.0; } /* Compute opponent's result */ result[!who] = 1.0 - result[who]; /* Perform final training */ perform_training(g, who, result); /* Clear past input array */ clear_store(&learner[who]); /* One more training iteration done */ learner[who].num_training++; }
/*! \brief places object in the store so the user can see them * * \param [in] state * \param [in] objects the list of objects to put in the store */ static void assign_store (GschemFindTextState *state, GSList *objects) { GSList *object_iter; g_return_if_fail (state != NULL); g_return_if_fail (state->store != NULL); clear_store (state); object_iter = objects; while (object_iter != NULL) { char *basename; OBJECT *object = (OBJECT*) object_iter->data; const char *str; GtkTreeIter tree_iter; object_iter = g_slist_next (object_iter); if (object == NULL) { g_warning ("NULL object encountered"); continue; } if (object->page == NULL) { g_warning ("NULL page encountered"); continue; } if (object->type != OBJ_TEXT) { g_warning ("expecting a text object"); continue; } str = geda_text_object_get_string (object); if (str == NULL) { g_warning ("NULL string encountered"); continue; } s_object_weak_ref (object, (NotifyFunc) object_weakref_cb, state); gtk_list_store_append (state->store, &tree_iter); basename = g_path_get_basename (s_page_get_filename (object->page)); gtk_list_store_set (state->store, &tree_iter, COLUMN_FILENAME, basename, COLUMN_STRING, str, COLUMN_OBJECT, object, -1); g_free (basename); } }
/* * Destroy a neural net. */ void free_net(net *learn) { int i; /* Free simple arrays */ free(learn->input_value); free(learn->prev_input); free(learn->hidden_sum); free(learn->hidden_result); free(learn->hidden_error); free(learn->net_result); free(learn->win_prob); /* Free rows of hidden weights */ for (i = 0; i < learn->num_inputs + 1; i++) { /* Free weight row */ free(learn->hidden_weight[i]); free(learn->hidden_delta[i]); } /* Free list of rows */ free(learn->hidden_weight); free(learn->hidden_delta); /* Free rows of output weights */ for (i = 0; i < learn->num_hidden + 1; i++) { /* Free weight row */ free(learn->output_weight[i]); free(learn->output_delta[i]); } /* Free list of rows */ free(learn->output_weight); free(learn->output_delta); /* Clear old past input sets */ clear_store(learn); /* Free list of past inputs */ free(learn->past_input); free(learn->past_input_player); /* Free input names */ for (i = 0; i < learn->num_inputs; i++) { /* Free name if set */ if (learn->input_name[i]) free(learn->input_name[i]); } /* Free array of input names */ free(learn->input_name); }
/*! \brief Dispose of the object */ static void dispose (GObject *object) { GschemFindTextState *state = GSCHEM_FIND_TEXT_STATE (object); if (state->store) { clear_store (state); g_object_unref (state->store); state->store = NULL; } /* lastly, chain up to the parent dispose */ g_return_if_fail (gschem_find_text_state_parent_class != NULL); gschem_find_text_state_parent_class->dispose (object); }