diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-06-12 09:59:00 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-06-12 09:59:00 +0000 |
commit | 47f8e95b1b10961d37e7fd3ae26c697130ce9e91 (patch) | |
tree | c786f63a8355131a92af74800b46858ab9694536 /src/ats/plugin_ats_ril.c | |
parent | e2e4a05a592edb53c7ba182564b2c9b4c11388ca (diff) |
code cleanup
Diffstat (limited to 'src/ats/plugin_ats_ril.c')
-rw-r--r-- | src/ats/plugin_ats_ril.c | 727 |
1 files changed, 382 insertions, 345 deletions
diff --git a/src/ats/plugin_ats_ril.c b/src/ats/plugin_ats_ril.c index fef969a896..03bddad501 100644 --- a/src/ats/plugin_ats_ril.c +++ b/src/ats/plugin_ats_ril.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2011 Christian Grothoff (and other contributing authors) + (C) 2011-2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -24,7 +24,13 @@ * @author Fabian Oehlmann * @author Matthias Wachs */ -#include "plugin_ats_ril.h" +#include "platform.h" +#include <float.h> +#include <math.h> +#include "gnunet_ats_plugin.h" +#include "gnunet-service-ats_addresses.h" + + #define LOG(kind,...) GNUNET_log_from (kind, "ats-ril",__VA_ARGS__) @@ -2130,11 +2136,11 @@ ril_cut_from_vector (void **old, * @param kind the kind to change the preference * @param pref_rel the normalized preference value for this kind over all clients */ -void +static void GAS_ril_address_change_preference (void *solver, - const struct GNUNET_PeerIdentity *peer, - enum GNUNET_ATS_PreferenceKind kind, - double pref_rel) + const struct GNUNET_PeerIdentity *peer, + enum GNUNET_ATS_PreferenceKind kind, + double pref_rel) { LOG(GNUNET_ERROR_TYPE_DEBUG, "API_address_change_preference() Preference '%s' for peer '%s' changed to %.2f \n", @@ -2147,308 +2153,6 @@ GAS_ril_address_change_preference (void *solver, ril_step (s); } -/** - * Entry point for the plugin - * - * @param cls pointer to the 'struct GNUNET_ATS_PluginEnvironment' - */ -void * -libgnunet_plugin_ats_ril_init (void *cls) -{ - struct GNUNET_ATS_PluginEnvironment *env = cls; - struct GAS_RIL_Handle *solver = GNUNET_new (struct GAS_RIL_Handle); - struct RIL_Scope * cur; - int c; - char *string; - float f_tmp; - - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_init() Initializing RIL solver\n"); - - GNUNET_assert(NULL != env); - GNUNET_assert(NULL != env->cfg); - GNUNET_assert(NULL != env->stats); - GNUNET_assert(NULL != env->bandwidth_changed_cb); - GNUNET_assert(NULL != env->get_preferences); - GNUNET_assert(NULL != env->get_property); - - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(env->cfg, "ats", "RIL_RBF_DIVISOR", &solver->parameters.rbf_divisor)) - { - solver->parameters.rbf_divisor = RIL_DEFAULT_RBF_DIVISOR; - } - - if (GNUNET_OK - != GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MIN", - &solver->parameters.step_time_min)) - { - solver->parameters.step_time_min = RIL_DEFAULT_STEP_TIME_MIN; - } - - if (GNUNET_OK - != GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MAX", - &solver->parameters.step_time_max)) - { - solver->parameters.step_time_max = RIL_DEFAULT_STEP_TIME_MAX; - } - - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (env->cfg, "ats", "RIL_ALGORITHM", &string)) - { - solver->parameters.algorithm = !strcmp (string, "SARSA") ? RIL_ALGO_SARSA : RIL_ALGO_Q; - GNUNET_free (string); - } - else - { - solver->parameters.algorithm = RIL_DEFAULT_ALGORITHM; - } - - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (env->cfg, "ats", "RIL_SELECT", &string)) - { - solver->parameters.select = !strcmp (string, "EGREEDY") ? RIL_SELECT_EGREEDY : RIL_SELECT_SOFTMAX; - GNUNET_free (string); - } - else - { - solver->parameters.select = RIL_DEFAULT_SELECT; - } - - - solver->parameters.beta = RIL_DEFAULT_DISCOUNT_BETA; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_DISCOUNT_BETA", &f_tmp)) - { - if (f_tmp < 0.0) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_DISCOUNT_BETA", f_tmp); - } - else - { - solver->parameters.beta = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_DISCOUNT_BETA", f_tmp); - } - } - - solver->parameters.gamma = RIL_DEFAULT_DISCOUNT_GAMMA; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_DISCOUNT_GAMMA", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 1.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_DISCOUNT_GAMMA", f_tmp); - } - else - { - solver->parameters.gamma = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_DISCOUNT_GAMMA", f_tmp); - } - } - - solver->parameters.alpha = RIL_DEFAULT_GRADIENT_STEP_SIZE; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_GRADIENT_STEP_SIZE", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 1.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_GRADIENT_STEP_SIZE", f_tmp); - } - else - { - solver->parameters.alpha = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_GRADIENT_STEP_SIZE", f_tmp); - } - } - - solver->parameters.lambda = RIL_DEFAULT_TRACE_DECAY; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_TRACE_DECAY", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 1.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_TRACE_DECAY", f_tmp); - } - else - { - solver->parameters.lambda = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_TRACE_DECAY", f_tmp); - } - } - - solver->parameters.epsilon_init = RIL_DEFAULT_EXPLORE_RATIO; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_EXPLORE_RATIO", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 1.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_EXPLORE_RATIO", f_tmp); - } - else - { - solver->parameters.epsilon_init = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_EXPLORE_RATIO", f_tmp); - } - } - - solver->parameters.epsilon_decay = RIL_DEFAULT_EXPLORE_DECAY; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_EXPLORE_DECAY", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 0.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_EXPLORE_DECAY", f_tmp); - } - else - { - solver->parameters.epsilon_decay = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_EXPLORE_DECAY", f_tmp); - } - } - - solver->parameters.temperature_init = RIL_DEFAULT_TEMPERATURE; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_TEMPERATURE", &f_tmp)) - { - if (f_tmp <= 0.0) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_TEMPERATURE", f_tmp); - } - else - { - solver->parameters.temperature_init = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_TEMPERATURE", f_tmp); - } - } - - solver->parameters.temperature_decay = RIL_DEFAULT_TEMPERATURE_DECAY; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "RIL_TEMPERATURE_DECAY", &f_tmp)) - { - if ((f_tmp <= 0.0) || solver->parameters.temperature_decay > 1) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "RIL_TEMPERATURE_DECAY", f_tmp); - } - else - { - solver->parameters.temperature_decay = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "RIL_TEMPERATURE_DECAY", f_tmp); - } - } - - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg, "ats", "RIL_SIMULATE", &solver->simulate)) - { - solver->simulate = GNUNET_NO; - } - - if (GNUNET_YES == GNUNET_CONFIGURATION_get_value_yesno(env->cfg, "ats", "RIL_REPLACE_TRACES")) - { - solver->parameters.eligibility_trace_mode = RIL_E_REPLACE; - } - else - { - solver->parameters.eligibility_trace_mode = RIL_E_ACCUMULATE; - } - - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (env->cfg, "ats", "RIL_SOCIAL_WELFARE", &string)) - { - solver->parameters.social_welfare = !strcmp (string, "NASH") ? RIL_WELFARE_NASH : RIL_WELFARE_EGALITARIAN; - GNUNET_free (string); - } - else - { - solver->parameters.social_welfare = RIL_DEFAULT_WELFARE; - } - - env->sf.s_add = &GAS_ril_address_add; - env->sf.s_address_update_property = &GAS_ril_address_property_changed; - env->sf.s_address_update_session = &GAS_ril_address_session_changed; - env->sf.s_address_update_inuse = &GAS_ril_address_inuse_changed; - env->sf.s_address_update_network = &GAS_ril_address_change_network; - env->sf.s_get = &GAS_ril_get_preferred_address; - env->sf.s_get_stop = &GAS_ril_stop_get_preferred_address; - env->sf.s_pref = &GAS_ril_address_change_preference; - env->sf.s_feedback = &GAS_ril_address_preference_feedback; - env->sf.s_del = &GAS_ril_address_delete; - env->sf.s_bulk_start = &GAS_ril_bulk_start; - env->sf.s_bulk_stop = &GAS_ril_bulk_stop; - - solver->plugin_envi = env; - solver->networks_count = env->network_count; - solver->network_entries = GNUNET_malloc (env->network_count * sizeof (struct RIL_Scope)); - solver->step_count = 0; - solver->done = GNUNET_NO; - - for (c = 0; c < env->network_count; c++) - { - cur = &solver->network_entries[c]; - cur->type = env->networks[c]; - cur->bw_in_available = env->in_quota[c]; - cur->bw_out_available = env->out_quota[c]; - LOG(GNUNET_ERROR_TYPE_DEBUG, "init() Quotas for %s network: IN %llu - OUT %llu\n", GNUNET_ATS_print_network_type(cur->type), cur->bw_in_available/1024, cur->bw_out_available/1024); - } - - LOG(GNUNET_ERROR_TYPE_DEBUG, "init() Parameters:\n"); - LOG(GNUNET_ERROR_TYPE_DEBUG, "init() Algorithm = %s, alpha = %f, beta = %f, lambda = %f\n", - solver->parameters.algorithm ? "Q" : "SARSA", - solver->parameters.alpha, - solver->parameters.beta, - solver->parameters.lambda); - LOG(GNUNET_ERROR_TYPE_DEBUG, "init() exploration_ratio = %f, temperature = %f, ActionSelection = %s\n", - solver->parameters.epsilon, - solver->parameters.temperature, - solver->parameters.select ? "EGREEDY" : "SOFTMAX"); - LOG(GNUNET_ERROR_TYPE_DEBUG, "init() RBF_DIVISOR = %llu\n", - solver->parameters.rbf_divisor); - - return solver; -} - -/** - * Exit point for the plugin - * - * @param cls the solver handle - */ -void * -libgnunet_plugin_ats_ril_done (void *cls) -{ - struct GAS_RIL_Handle *s = cls; - struct RIL_Peer_Agent *cur_agent; - struct RIL_Peer_Agent *next_agent; - - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_done() Shutting down RIL solver\n"); - - s->done = GNUNET_YES; - - cur_agent = s->agents_head; - while (NULL != cur_agent) - { - next_agent = cur_agent->next; - GNUNET_CONTAINER_DLL_remove(s->agents_head, s->agents_tail, cur_agent); - agent_die (s, cur_agent); - cur_agent = next_agent; - } - - if (GNUNET_SCHEDULER_NO_TASK != s->step_next_task_id) - { - GNUNET_SCHEDULER_cancel (s->step_next_task_id); - } - GNUNET_free(s->network_entries); - GNUNET_free(s); - - return NULL; -} /** * Add a new address for a peer to the solver @@ -2459,8 +2163,10 @@ libgnunet_plugin_ats_ril_done (void *cls) * @param address the address to add * @param network network type of this address */ -void -GAS_ril_address_add (void *solver, struct ATS_Address *address, uint32_t network) +static void +GAS_ril_address_add (void *solver, + struct ATS_Address *address, + uint32_t network) { struct GAS_RIL_Handle *s = solver; struct RIL_Peer_Agent *agent; @@ -2473,7 +2179,8 @@ GAS_ril_address_add (void *solver, struct ATS_Address *address, uint32_t network int i; unsigned int zero; - LOG (GNUNET_ERROR_TYPE_DEBUG, "API_address_add()\n"); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "API_address_add()\n"); net = ril_get_network (s, network); address->solver_information = net; @@ -2545,8 +2252,10 @@ GAS_ril_address_add (void *solver, struct ATS_Address *address, uint32_t network * @param address the address to remove * @param session_only delete only session not whole address */ -void -GAS_ril_address_delete (void *solver, struct ATS_Address *address, int session_only) +static void +GAS_ril_address_delete (void *solver, + struct ATS_Address *address, + int session_only) { struct GAS_RIL_Handle *s = solver; struct RIL_Peer_Agent *agent; @@ -2558,9 +2267,11 @@ GAS_ril_address_delete (void *solver, struct ATS_Address *address, int session_o int i; struct RIL_Scope *net; - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_address_delete() Delete %s%s %s address %s for peer '%s'\n", - session_only ? "session for " : "", address->active ? "active" : "inactive", address->plugin, - address->addr, GNUNET_i2s (&address->peer)); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "API_address_delete() Delete %s%s %s address %s for peer '%s'\n", + session_only ? "session for " : "", address->active ? "active" : "inactive", address->plugin, + address->addr, + GNUNET_i2s (&address->peer)); agent = ril_get_agent (s, &address->peer, GNUNET_NO); if (NULL == agent) @@ -2649,25 +2360,29 @@ GAS_ril_address_delete (void *solver, struct ATS_Address *address, int session_o * @param abs_value the absolute value of the property * @param rel_value the normalized value */ -void +static void GAS_ril_address_property_changed (void *solver, - struct ATS_Address *address, - uint32_t type, - uint32_t abs_value, - double rel_value) + struct ATS_Address *address, + uint32_t type, + uint32_t abs_value, + double rel_value) { + struct GAS_RIL_Handle *s = solver; + LOG(GNUNET_ERROR_TYPE_DEBUG, "API_address_property_changed() Property '%s' for peer '%s' address %s changed " - "to %.2f \n", GNUNET_ATS_print_property_type (type), GNUNET_i2s (&address->peer), + "to %.2f \n", + GNUNET_ATS_print_property_type (type), + GNUNET_i2s (&address->peer), address->addr, rel_value); - struct GAS_RIL_Handle *s = solver; s->parameters.temperature = s->parameters.temperature_init; s->parameters.epsilon = s->parameters.epsilon_init; ril_step (s); } + /** * Update the session of an address in the solver * @@ -2678,15 +2393,17 @@ GAS_ril_address_property_changed (void *solver, * @param cur_session the current session * @param new_session the new session */ -void +static void GAS_ril_address_session_changed (void *solver, - struct ATS_Address *address, - uint32_t cur_session, - uint32_t new_session) + struct ATS_Address *address, + uint32_t cur_session, + uint32_t new_session) { - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_address_session_changed()\n"); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "API_address_session_changed()\n"); } + /** * Notify the solver that an address is (not) actively used by transport * to communicate with a remote peer @@ -2697,14 +2414,17 @@ GAS_ril_address_session_changed (void *solver, * @param address the address * @param in_use usage state */ -void -GAS_ril_address_inuse_changed (void *solver, struct ATS_Address *address, int in_use) +static void +GAS_ril_address_inuse_changed (void *solver, + struct ATS_Address *address, + int in_use) { LOG(GNUNET_ERROR_TYPE_DEBUG, "API_address_inuse_changed() Usage for %s address of peer '%s' changed to %s\n", address->plugin, GNUNET_i2s (&address->peer), (GNUNET_YES == in_use) ? "USED" : "UNUSED"); } + /** * Notify solver that the network an address is located in has changed * @@ -2715,16 +2435,17 @@ GAS_ril_address_inuse_changed (void *solver, struct ATS_Address *address, int in * @param current_network the current network * @param new_network the new network */ -void +static void GAS_ril_address_change_network (void *solver, - struct ATS_Address *address, - uint32_t current_network, - uint32_t new_network) + struct ATS_Address *address, + uint32_t current_network, + uint32_t new_network) { struct GAS_RIL_Handle *s = solver; struct RIL_Peer_Agent *agent; - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_address_change_network() Network type changed, moving " + LOG(GNUNET_ERROR_TYPE_DEBUG, + "API_address_change_network() Network type changed, moving " "%s address of peer %s from '%s' to '%s'\n", (GNUNET_YES == address->active) ? "active" : "inactive", GNUNET_i2s (&address->peer), GNUNET_ATS_print_network_type (current_network), GNUNET_ATS_print_network_type (new_network)); @@ -2750,6 +2471,7 @@ GAS_ril_address_change_network (void *solver, address->solver_information = ril_get_network(solver, new_network); } + /** * Give feedback about the current assignment * @@ -2760,7 +2482,7 @@ GAS_ril_address_change_network (void *solver, * @param kind the kind to change the preference * @param score the score */ -void +static void GAS_ril_address_preference_feedback (void *solver, void *application, const struct GNUNET_PeerIdentity *peer, @@ -2774,32 +2496,37 @@ GAS_ril_address_preference_feedback (void *solver, GNUNET_ATS_print_preference_type (kind), scope.rel_value_us / 1000000); } + /** * Start a bulk operation * * @param solver the solver */ -void +static void GAS_ril_bulk_start (void *solver) { struct GAS_RIL_Handle *s = solver; - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_bulk_start() lock: %d\n", s->bulk_lock+1); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "API_bulk_start() lock: %d\n", s->bulk_lock+1); s->bulk_lock++; } + /** * Bulk operation done * * @param solver the solver handle */ -void +static void GAS_ril_bulk_stop (void *solver) { struct GAS_RIL_Handle *s = solver; - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_bulk_stop() lock: %d\n", s->bulk_lock-1); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "API_bulk_stop() lock: %d\n", + s->bulk_lock - 1); if (s->bulk_lock < 1) { @@ -2815,6 +2542,7 @@ GAS_ril_bulk_stop (void *solver) } } + /** * Tell solver to notify ATS if the address to use changes for a specific * peer using the bandwidth changed callback @@ -2825,8 +2553,9 @@ GAS_ril_bulk_stop (void *solver) * @param solver the solver handle * @param peer the identity of the peer */ -const struct ATS_Address * -GAS_ril_get_preferred_address (void *solver, const struct GNUNET_PeerIdentity *peer) +static const struct ATS_Address * +GAS_ril_get_preferred_address (void *solver, + const struct GNUNET_PeerIdentity *peer) { struct GAS_RIL_Handle *s = solver; struct RIL_Peer_Agent *agent; @@ -2866,13 +2595,15 @@ GAS_ril_get_preferred_address (void *solver, const struct GNUNET_PeerIdentity *p * @param solver the solver handle * @param peer the peer */ -void -GAS_ril_stop_get_preferred_address (void *solver, const struct GNUNET_PeerIdentity *peer) +static void +GAS_ril_stop_get_preferred_address (void *solver, + const struct GNUNET_PeerIdentity *peer) { struct GAS_RIL_Handle *s = solver; struct RIL_Peer_Agent *agent; - LOG(GNUNET_ERROR_TYPE_DEBUG, "API_stop_get_preferred_address()"); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "API_stop_get_preferred_address()"); agent = ril_get_agent (s, peer, GNUNET_NO); @@ -2902,4 +2633,310 @@ GAS_ril_stop_get_preferred_address (void *solver, const struct GNUNET_PeerIdenti GNUNET_i2s (peer), agent->address_inuse->plugin); } + +/** + * Entry point for the plugin + * + * @param cls pointer to the 'struct GNUNET_ATS_PluginEnvironment' + */ +void * +libgnunet_plugin_ats_ril_init (void *cls) +{ + struct GNUNET_ATS_PluginEnvironment *env = cls; + struct GAS_RIL_Handle *solver = GNUNET_new (struct GAS_RIL_Handle); + struct RIL_Scope * cur; + int c; + char *string; + float f_tmp; + + LOG(GNUNET_ERROR_TYPE_DEBUG, "API_init() Initializing RIL solver\n"); + + GNUNET_assert(NULL != env); + GNUNET_assert(NULL != env->cfg); + GNUNET_assert(NULL != env->stats); + GNUNET_assert(NULL != env->bandwidth_changed_cb); + GNUNET_assert(NULL != env->get_preferences); + GNUNET_assert(NULL != env->get_property); + + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(env->cfg, "ats", "RIL_RBF_DIVISOR", &solver->parameters.rbf_divisor)) + { + solver->parameters.rbf_divisor = RIL_DEFAULT_RBF_DIVISOR; + } + + if (GNUNET_OK + != GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MIN", + &solver->parameters.step_time_min)) + { + solver->parameters.step_time_min = RIL_DEFAULT_STEP_TIME_MIN; + } + + if (GNUNET_OK + != GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MAX", + &solver->parameters.step_time_max)) + { + solver->parameters.step_time_max = RIL_DEFAULT_STEP_TIME_MAX; + } + + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (env->cfg, "ats", "RIL_ALGORITHM", &string)) + { + solver->parameters.algorithm = !strcmp (string, "SARSA") ? RIL_ALGO_SARSA : RIL_ALGO_Q; + GNUNET_free (string); + } + else + { + solver->parameters.algorithm = RIL_DEFAULT_ALGORITHM; + } + + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (env->cfg, "ats", "RIL_SELECT", &string)) + { + solver->parameters.select = !strcmp (string, "EGREEDY") ? RIL_SELECT_EGREEDY : RIL_SELECT_SOFTMAX; + GNUNET_free (string); + } + else + { + solver->parameters.select = RIL_DEFAULT_SELECT; + } + + + solver->parameters.beta = RIL_DEFAULT_DISCOUNT_BETA; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_DISCOUNT_BETA", &f_tmp)) + { + if (f_tmp < 0.0) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_DISCOUNT_BETA", f_tmp); + } + else + { + solver->parameters.beta = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_DISCOUNT_BETA", f_tmp); + } + } + + solver->parameters.gamma = RIL_DEFAULT_DISCOUNT_GAMMA; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_DISCOUNT_GAMMA", &f_tmp)) + { + if ((f_tmp < 0.0) || (f_tmp > 1.0)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_DISCOUNT_GAMMA", f_tmp); + } + else + { + solver->parameters.gamma = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_DISCOUNT_GAMMA", f_tmp); + } + } + + solver->parameters.alpha = RIL_DEFAULT_GRADIENT_STEP_SIZE; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_GRADIENT_STEP_SIZE", &f_tmp)) + { + if ((f_tmp < 0.0) || (f_tmp > 1.0)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_GRADIENT_STEP_SIZE", f_tmp); + } + else + { + solver->parameters.alpha = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_GRADIENT_STEP_SIZE", f_tmp); + } + } + + solver->parameters.lambda = RIL_DEFAULT_TRACE_DECAY; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_TRACE_DECAY", &f_tmp)) + { + if ((f_tmp < 0.0) || (f_tmp > 1.0)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_TRACE_DECAY", f_tmp); + } + else + { + solver->parameters.lambda = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_TRACE_DECAY", f_tmp); + } + } + + solver->parameters.epsilon_init = RIL_DEFAULT_EXPLORE_RATIO; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_EXPLORE_RATIO", &f_tmp)) + { + if ((f_tmp < 0.0) || (f_tmp > 1.0)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_EXPLORE_RATIO", f_tmp); + } + else + { + solver->parameters.epsilon_init = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_EXPLORE_RATIO", f_tmp); + } + } + + solver->parameters.epsilon_decay = RIL_DEFAULT_EXPLORE_DECAY; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_EXPLORE_DECAY", &f_tmp)) + { + if ((f_tmp < 0.0) || (f_tmp > 0.0)) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_EXPLORE_DECAY", f_tmp); + } + else + { + solver->parameters.epsilon_decay = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_EXPLORE_DECAY", f_tmp); + } + } + + solver->parameters.temperature_init = RIL_DEFAULT_TEMPERATURE; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_TEMPERATURE", &f_tmp)) + { + if (f_tmp <= 0.0) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_TEMPERATURE", f_tmp); + } + else + { + solver->parameters.temperature_init = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_TEMPERATURE", f_tmp); + } + } + + solver->parameters.temperature_decay = RIL_DEFAULT_TEMPERATURE_DECAY; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", + "RIL_TEMPERATURE_DECAY", &f_tmp)) + { + if ((f_tmp <= 0.0) || solver->parameters.temperature_decay > 1) + { + LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "RIL_TEMPERATURE_DECAY", f_tmp); + } + else + { + solver->parameters.temperature_decay = f_tmp; + LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "RIL_TEMPERATURE_DECAY", f_tmp); + } + } + + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg, "ats", "RIL_SIMULATE", &solver->simulate)) + { + solver->simulate = GNUNET_NO; + } + + if (GNUNET_YES == GNUNET_CONFIGURATION_get_value_yesno(env->cfg, "ats", "RIL_REPLACE_TRACES")) + { + solver->parameters.eligibility_trace_mode = RIL_E_REPLACE; + } + else + { + solver->parameters.eligibility_trace_mode = RIL_E_ACCUMULATE; + } + + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (env->cfg, "ats", "RIL_SOCIAL_WELFARE", &string)) + { + solver->parameters.social_welfare = !strcmp (string, "NASH") ? RIL_WELFARE_NASH : RIL_WELFARE_EGALITARIAN; + GNUNET_free (string); + } + else + { + solver->parameters.social_welfare = RIL_DEFAULT_WELFARE; + } + + env->sf.s_add = &GAS_ril_address_add; + env->sf.s_address_update_property = &GAS_ril_address_property_changed; + env->sf.s_address_update_session = &GAS_ril_address_session_changed; + env->sf.s_address_update_inuse = &GAS_ril_address_inuse_changed; + env->sf.s_address_update_network = &GAS_ril_address_change_network; + env->sf.s_get = &GAS_ril_get_preferred_address; + env->sf.s_get_stop = &GAS_ril_stop_get_preferred_address; + env->sf.s_pref = &GAS_ril_address_change_preference; + env->sf.s_feedback = &GAS_ril_address_preference_feedback; + env->sf.s_del = &GAS_ril_address_delete; + env->sf.s_bulk_start = &GAS_ril_bulk_start; + env->sf.s_bulk_stop = &GAS_ril_bulk_stop; + + solver->plugin_envi = env; + solver->networks_count = env->network_count; + solver->network_entries = GNUNET_malloc (env->network_count * sizeof (struct RIL_Scope)); + solver->step_count = 0; + solver->done = GNUNET_NO; + + for (c = 0; c < env->network_count; c++) + { + cur = &solver->network_entries[c]; + cur->type = env->networks[c]; + cur->bw_in_available = env->in_quota[c]; + cur->bw_out_available = env->out_quota[c]; + LOG(GNUNET_ERROR_TYPE_DEBUG, "init() Quotas for %s network: IN %llu - OUT %llu\n", GNUNET_ATS_print_network_type(cur->type), cur->bw_in_available/1024, cur->bw_out_available/1024); + } + + LOG(GNUNET_ERROR_TYPE_DEBUG, "init() Parameters:\n"); + LOG(GNUNET_ERROR_TYPE_DEBUG, "init() Algorithm = %s, alpha = %f, beta = %f, lambda = %f\n", + solver->parameters.algorithm ? "Q" : "SARSA", + solver->parameters.alpha, + solver->parameters.beta, + solver->parameters.lambda); + LOG(GNUNET_ERROR_TYPE_DEBUG, "init() exploration_ratio = %f, temperature = %f, ActionSelection = %s\n", + solver->parameters.epsilon, + solver->parameters.temperature, + solver->parameters.select ? "EGREEDY" : "SOFTMAX"); + LOG(GNUNET_ERROR_TYPE_DEBUG, "init() RBF_DIVISOR = %llu\n", + solver->parameters.rbf_divisor); + + return solver; +} + + +/** + * Exit point for the plugin + * + * @param cls the solver handle + */ +void * +libgnunet_plugin_ats_ril_done (void *cls) +{ + struct GAS_RIL_Handle *s = cls; + struct RIL_Peer_Agent *cur_agent; + struct RIL_Peer_Agent *next_agent; + + LOG(GNUNET_ERROR_TYPE_DEBUG, "API_done() Shutting down RIL solver\n"); + + s->done = GNUNET_YES; + + cur_agent = s->agents_head; + while (NULL != cur_agent) + { + next_agent = cur_agent->next; + GNUNET_CONTAINER_DLL_remove(s->agents_head, s->agents_tail, cur_agent); + agent_die (s, cur_agent); + cur_agent = next_agent; + } + + if (GNUNET_SCHEDULER_NO_TASK != s->step_next_task_id) + { + GNUNET_SCHEDULER_cancel (s->step_next_task_id); + } + GNUNET_free(s->network_entries); + GNUNET_free(s); + + return NULL; +} + + /* end of plugin_ats_ril.c */ |