diff options
author | Fabian Oehlmann <oehlmann@in.tum.de> | 2013-12-27 16:01:59 +0000 |
---|---|---|
committer | Fabian Oehlmann <oehlmann@in.tum.de> | 2013-12-27 16:01:59 +0000 |
commit | fbfd23141c29c3cb91a72261976963fd497407e7 (patch) | |
tree | 676cf3fdf422db8c4b4a1c6ad58ca3231bd83dbe /src | |
parent | 394634143752c70d698b01ecaaa62486957aac2f (diff) | |
download | gnunet-fbfd23141c29c3cb91a72261976963fd497407e7.tar.gz gnunet-fbfd23141c29c3cb91a72261976963fd497407e7.zip |
changed function approximation to radial basis functions
Diffstat (limited to 'src')
-rwxr-xr-x | src/ats/plugin_ats_ril.c | 135 |
1 files changed, 45 insertions, 90 deletions
diff --git a/src/ats/plugin_ats_ril.c b/src/ats/plugin_ats_ril.c index a918baa2b..2c268d8ba 100755 --- a/src/ats/plugin_ats_ril.c +++ b/src/ats/plugin_ats_ril.c | |||
@@ -31,9 +31,6 @@ | |||
31 | #define MIN_BW ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__) | 31 | #define MIN_BW ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__) |
32 | 32 | ||
33 | #define RIL_ACTION_INVALID -1 | 33 | #define RIL_ACTION_INVALID -1 |
34 | #define RIL_FEATURES_ADDRESS_COUNT (0)// + GNUNET_ATS_QualityPropertiesCount) | ||
35 | #define RIL_FEATURES_NETWORK_COUNT 2 | ||
36 | #define RIL_FEATURES_INIT_COUNT 1 + RIL_FEATURES_NETWORK_COUNT // + GNUNET_ATS_PreferenceCount | ||
37 | #define RIL_INTERVAL_EXPONENT 10 | 34 | #define RIL_INTERVAL_EXPONENT 10 |
38 | #define RIL_UTILITY_MAX (double) GNUNET_ATS_MaxBandwidth | 35 | #define RIL_UTILITY_MAX (double) GNUNET_ATS_MaxBandwidth |
39 | 36 | ||
@@ -45,6 +42,7 @@ | |||
45 | #define RIL_DEFAULT_GRADIENT_STEP_SIZE 0.1 | 42 | #define RIL_DEFAULT_GRADIENT_STEP_SIZE 0.1 |
46 | #define RIL_DEFAULT_TRACE_DECAY 0.5 | 43 | #define RIL_DEFAULT_TRACE_DECAY 0.5 |
47 | #define RIL_DEFAULT_EXPLORE_RATIO 0.1 | 44 | #define RIL_DEFAULT_EXPLORE_RATIO 0.1 |
45 | #define RIL_DEFAULT_DIVISOR 10 | ||
48 | #define RIL_DEFAULT_GLOBAL_REWARD_SHARE 0.5 | 46 | #define RIL_DEFAULT_GLOBAL_REWARD_SHARE 0.5 |
49 | 47 | ||
50 | #define RIL_INC_DEC_STEP_SIZE 1 | 48 | #define RIL_INC_DEC_STEP_SIZE 1 |
@@ -120,6 +118,11 @@ struct RIL_Learning_Parameters | |||
120 | double lambda; | 118 | double lambda; |
121 | 119 | ||
122 | /** | 120 | /** |
121 | * State space divisor | ||
122 | */ | ||
123 | unsigned long long int divisor; | ||
124 | |||
125 | /** | ||
123 | * Ratio, with what probability an agent should explore in the e-greed policy | 126 | * Ratio, with what probability an agent should explore in the e-greed policy |
124 | */ | 127 | */ |
125 | double explore_ratio; | 128 | double explore_ratio; |
@@ -328,11 +331,6 @@ struct GAS_RIL_Handle | |||
328 | double global_discount_integrated; | 331 | double global_discount_integrated; |
329 | 332 | ||
330 | /** | 333 | /** |
331 | * State vector for networks for the current step | ||
332 | */ | ||
333 | double *global_state_networks; | ||
334 | |||
335 | /** | ||
336 | * Lock for bulk operations | 334 | * Lock for bulk operations |
337 | */ | 335 | */ |
338 | int bulk_lock; | 336 | int bulk_lock; |
@@ -734,28 +732,6 @@ ril_network_get_assigned (struct GAS_RIL_Handle *solver, enum GNUNET_ATS_Network | |||
734 | return sum; | 732 | return sum; |
735 | } | 733 | } |
736 | 734 | ||
737 | //static void | ||
738 | //envi_state_networks (struct GAS_RIL_Handle *solver) | ||
739 | //{ | ||
740 | // int i; | ||
741 | // struct RIL_Network net; | ||
742 | // int overutilized_in; | ||
743 | // int overutilized_out; | ||
744 | // | ||
745 | // for (i = 0; i < solver->networks_count; i++) | ||
746 | // { | ||
747 | // net = solver->network_entries[i]; | ||
748 | // | ||
749 | // overutilized_in = net.bw_in_assigned > net.bw_in_available; | ||
750 | // overutilized_out = net.bw_out_assigned > net.bw_out_available; | ||
751 | // | ||
752 | // solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 0] = ((double) net.bw_in_assigned / (double) net.bw_in_available)*10; | ||
753 | // solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 1] = (double) overutilized_in; | ||
754 | // solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 2] = ((double) net.bw_out_assigned / (double) net.bw_out_available)*10; | ||
755 | // solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 3] = (double) overutilized_out; | ||
756 | // } | ||
757 | //} | ||
758 | |||
759 | /** | 735 | /** |
760 | * Allocates a state vector and fills it with the features present | 736 | * Allocates a state vector and fills it with the features present |
761 | * @param solver the solver handle | 737 | * @param solver the solver handle |
@@ -765,55 +741,35 @@ ril_network_get_assigned (struct GAS_RIL_Handle *solver, enum GNUNET_ATS_Network | |||
765 | static double * | 741 | static double * |
766 | envi_get_state (struct GAS_RIL_Handle *solver, struct RIL_Peer_Agent *agent) | 742 | envi_get_state (struct GAS_RIL_Handle *solver, struct RIL_Peer_Agent *agent) |
767 | { | 743 | { |
768 | // int i; | 744 | double *state; |
769 | // int k; | 745 | double y[2]; |
770 | double *state = GNUNET_malloc (sizeof (double) * agent->m); | 746 | double x[2]; |
771 | // struct RIL_Address_Wrapped *cur_address; | 747 | double d[2]; |
772 | // const double *preferences; | 748 | double sigma; |
773 | // const double *properties; | 749 | double f; |
774 | struct RIL_Network *net; | 750 | int m; |
775 | 751 | int i; | |
776 | //copy global networks state | 752 | int k; |
777 | // for (i = 0; i < solver->networks_count * RIL_FEATURES_NETWORK_COUNT; i++) | ||
778 | // { | ||
779 | // state[i] = solver->global_state_networks[i]; | ||
780 | // } | ||
781 | |||
782 | net = agent->address_inuse->solver_information; | ||
783 | |||
784 | state[0] = 1; | ||
785 | state[1] = (double) net->bw_in_assigned / (double) GNUNET_ATS_MaxBandwidth; | ||
786 | state[2] = GNUNET_MIN((double) (net->bw_in_available - net->bw_in_assigned), 0) / (double) GNUNET_ATS_MaxBandwidth; | ||
787 | |||
788 | // LOG(GNUNET_ERROR_TYPE_INFO, "get_state() state[0] = %f\n", state[0]); | ||
789 | // LOG(GNUNET_ERROR_TYPE_INFO, "get_state() state[1] = %f\n", state[1]); | ||
790 | // | ||
791 | // LOG(GNUNET_ERROR_TYPE_INFO, "get_state() W / %08.3f %08.3f \\ \n", agent->W[0][0], agent->W[1][0]); | ||
792 | // LOG(GNUNET_ERROR_TYPE_INFO, "get_state() W \\ %08.3f %08.3f / \n", agent->W[0][1], agent->W[1][1]); | ||
793 | 753 | ||
754 | state = GNUNET_malloc (sizeof(agent->m)); | ||
794 | 755 | ||
795 | //get peer features | 756 | y[0] = (double) agent->bw_out; |
796 | // preferences = solver->plugin_envi->get_preferences (solver->plugin_envi->get_preference_cls, | 757 | y[1] = (double) agent->bw_in; |
797 | // &agent->peer); | ||
798 | // for (k = 0; k < GNUNET_ATS_PreferenceCount; k++) | ||
799 | // { | ||
800 | // state[i++] = preferences[k]; | ||
801 | // } | ||
802 | 758 | ||
803 | //get address specific features | 759 | m = agent_address_get_index (agent, agent->address_inuse) * (solver->parameters.divisor+1) * (solver->parameters.divisor+1); |
804 | // for (cur_address = agent->addresses_head; NULL != cur_address; cur_address = cur_address->next) | 760 | for (i = 0; i <= solver->parameters.divisor; i++) |
805 | // { | 761 | { |
806 | // //when changing the number of address specific state features, change RIL_FEATURES_ADDRESS_COUNT macro | 762 | for (k = 0; k <= solver->parameters.divisor; k++) |
807 | // state[i++] = cur_address->address_naked->active; | 763 | { |
808 | // state[i++] = cur_address->address_naked->active ? agent->bw_in : 0; | 764 | x[0] = i * GNUNET_ATS_MaxBandwidth / solver->parameters.divisor; |
809 | // state[i++] = cur_address->address_naked->active ? agent->bw_out : 0; | 765 | x[1] = k * GNUNET_ATS_MaxBandwidth / solver->parameters.divisor; |
810 | // properties = solver->plugin_envi->get_property (solver->plugin_envi->get_property_cls, | 766 | d[0] = x[0]-y[0]; |
811 | // cur_address->address_naked); | 767 | d[1] = x[1]-y[1]; |
812 | // for (k = 0; k < GNUNET_ATS_QualityPropertiesCount; k++) | 768 | sigma = ((double) GNUNET_ATS_MaxBandwidth / 2) * M_SQRT2; |
813 | // { | 769 | f = exp(-((d[0]*d[0] + d[1]*d[1]) / (2 * sigma * sigma))); |
814 | // state[i++] = properties[k]; | 770 | state[m++] = f; |
815 | // } | 771 | } |
816 | // } | 772 | } |
817 | 773 | ||
818 | return state; | 774 | return state; |
819 | } | 775 | } |
@@ -1634,7 +1590,7 @@ agent_init (void *s, const struct GNUNET_PeerIdentity *peer) | |||
1634 | agent->bw_out = MIN_BW; | 1590 | agent->bw_out = MIN_BW; |
1635 | agent->suggestion_issue = GNUNET_NO; | 1591 | agent->suggestion_issue = GNUNET_NO; |
1636 | agent->n = RIL_ACTION_TYPE_NUM; | 1592 | agent->n = RIL_ACTION_TYPE_NUM; |
1637 | agent->m = RIL_FEATURES_INIT_COUNT; | 1593 | agent->m = 0; |
1638 | agent->W = (double **) GNUNET_malloc (sizeof (double *) * agent->n); | 1594 | agent->W = (double **) GNUNET_malloc (sizeof (double *) * agent->n); |
1639 | for (i = 0; i < agent->n; i++) | 1595 | for (i = 0; i < agent->n; i++) |
1640 | { | 1596 | { |
@@ -1817,6 +1773,10 @@ libgnunet_plugin_ats_ril_init (void *cls) | |||
1817 | GNUNET_assert(NULL != env->get_preferences); | 1773 | GNUNET_assert(NULL != env->get_preferences); |
1818 | GNUNET_assert(NULL != env->get_property); | 1774 | GNUNET_assert(NULL != env->get_property); |
1819 | 1775 | ||
1776 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(env->cfg, "ats", "RIL_DIVISOR", &solver->parameters.divisor)) | ||
1777 | { | ||
1778 | solver->parameters.divisor = RIL_DEFAULT_DIVISOR; | ||
1779 | } | ||
1820 | if (GNUNET_OK | 1780 | if (GNUNET_OK |
1821 | != GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MIN", | 1781 | != GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MIN", |
1822 | &solver->parameters.step_time_min)) | 1782 | &solver->parameters.step_time_min)) |
@@ -1945,7 +1905,6 @@ libgnunet_plugin_ats_ril_init (void *cls) | |||
1945 | solver->networks_count = env->network_count; | 1905 | solver->networks_count = env->network_count; |
1946 | solver->network_entries = GNUNET_malloc (env->network_count * sizeof (struct RIL_Network)); | 1906 | solver->network_entries = GNUNET_malloc (env->network_count * sizeof (struct RIL_Network)); |
1947 | solver->step_count = 0; | 1907 | solver->step_count = 0; |
1948 | solver->global_state_networks = GNUNET_malloc (solver->networks_count * RIL_FEATURES_NETWORK_COUNT * sizeof (double)); | ||
1949 | solver->done = GNUNET_NO; | 1908 | solver->done = GNUNET_NO; |
1950 | 1909 | ||
1951 | for (c = 0; c < env->network_count; c++) | 1910 | for (c = 0; c < env->network_count; c++) |
@@ -2000,7 +1959,6 @@ libgnunet_plugin_ats_ril_done (void *cls) | |||
2000 | GNUNET_SCHEDULER_cancel (s->step_next_task_id); | 1959 | GNUNET_SCHEDULER_cancel (s->step_next_task_id); |
2001 | } | 1960 | } |
2002 | GNUNET_free(s->network_entries); | 1961 | GNUNET_free(s->network_entries); |
2003 | GNUNET_free(s->global_state_networks); | ||
2004 | GNUNET_free(s); | 1962 | GNUNET_free(s); |
2005 | 1963 | ||
2006 | return NULL; | 1964 | return NULL; |
@@ -2050,7 +2008,7 @@ GAS_ril_address_add (void *solver, struct ATS_Address *address, uint32_t network | |||
2050 | GNUNET_CONTAINER_DLL_insert_tail(agent->addresses_head, agent->addresses_tail, address_wrapped); | 2008 | GNUNET_CONTAINER_DLL_insert_tail(agent->addresses_head, agent->addresses_tail, address_wrapped); |
2051 | 2009 | ||
2052 | //increase size of W | 2010 | //increase size of W |
2053 | m_new = agent->m + RIL_FEATURES_ADDRESS_COUNT; | 2011 | m_new = agent->m + ((s->parameters.divisor+1) * (s->parameters.divisor+1)); |
2054 | m_old = agent->m; | 2012 | m_old = agent->m; |
2055 | n_new = agent->n + 1; | 2013 | n_new = agent->n + 1; |
2056 | n_old = agent->n; | 2014 | n_old = agent->n; |
@@ -2138,7 +2096,7 @@ GAS_ril_address_delete (void *solver, struct ATS_Address *address, int session_o | |||
2138 | GNUNET_free(address_wrapped); | 2096 | GNUNET_free(address_wrapped); |
2139 | 2097 | ||
2140 | //decrease W | 2098 | //decrease W |
2141 | m_new = agent->m - RIL_FEATURES_ADDRESS_COUNT; | 2099 | m_new = agent->m - ((s->parameters.divisor+1) * (s->parameters.divisor+1)); |
2142 | n_new = agent->n - 1; | 2100 | n_new = agent->n - 1; |
2143 | 2101 | ||
2144 | LOG(GNUNET_ERROR_TYPE_DEBUG, "first\n"); | 2102 | LOG(GNUNET_ERROR_TYPE_DEBUG, "first\n"); |
@@ -2146,9 +2104,8 @@ GAS_ril_address_delete (void *solver, struct ATS_Address *address, int session_o | |||
2146 | for (i = 0; i < agent->n; i++) | 2104 | for (i = 0; i < agent->n; i++) |
2147 | { | 2105 | { |
2148 | ril_cut_from_vector ((void **) &agent->W[i], sizeof(double), | 2106 | ril_cut_from_vector ((void **) &agent->W[i], sizeof(double), |
2149 | //((s->networks_count * RIL_FEATURES_NETWORK_COUNT) | 2107 | address_index * ((s->parameters.divisor+1) * (s->parameters.divisor+1)), |
2150 | ((RIL_FEATURES_INIT_COUNT) //TODO! replace, when adding more networks | 2108 | ((s->parameters.divisor+1) * (s->parameters.divisor+1)), agent->m); |
2151 | + (address_index * RIL_FEATURES_ADDRESS_COUNT)), RIL_FEATURES_ADDRESS_COUNT, agent->m); | ||
2152 | } | 2109 | } |
2153 | GNUNET_free(agent->W[RIL_ACTION_TYPE_NUM + address_index]); | 2110 | GNUNET_free(agent->W[RIL_ACTION_TYPE_NUM + address_index]); |
2154 | LOG(GNUNET_ERROR_TYPE_DEBUG, "second\n"); | 2111 | LOG(GNUNET_ERROR_TYPE_DEBUG, "second\n"); |
@@ -2166,13 +2123,11 @@ GAS_ril_address_delete (void *solver, struct ATS_Address *address, int session_o | |||
2166 | //decrease old state vector and eligibility vector | 2123 | //decrease old state vector and eligibility vector |
2167 | LOG(GNUNET_ERROR_TYPE_DEBUG, "third\n"); | 2124 | LOG(GNUNET_ERROR_TYPE_DEBUG, "third\n"); |
2168 | ril_cut_from_vector ((void **) &agent->s_old, sizeof(double), | 2125 | ril_cut_from_vector ((void **) &agent->s_old, sizeof(double), |
2169 | //((s->networks_count * RIL_FEATURES_NETWORK_COUNT) | 2126 | address_index * ((s->parameters.divisor+1) * (s->parameters.divisor+1)), |
2170 | ((RIL_FEATURES_INIT_COUNT) //TODO! replace when adding more networks | 2127 | ((s->parameters.divisor+1) * (s->parameters.divisor+1)), agent->m); |
2171 | + (address_index * RIL_FEATURES_ADDRESS_COUNT)), RIL_FEATURES_ADDRESS_COUNT, agent->m); | ||
2172 | ril_cut_from_vector ((void **) &agent->e, sizeof(double), | 2128 | ril_cut_from_vector ((void **) &agent->e, sizeof(double), |
2173 | //((s->networks_count * RIL_FEATURES_NETWORK_COUNT) | 2129 | address_index * ((s->parameters.divisor+1) * (s->parameters.divisor+1)), |
2174 | ((RIL_FEATURES_INIT_COUNT) //TODO! replace when adding more networks | 2130 | ((s->parameters.divisor+1) * (s->parameters.divisor+1)), agent->m); |
2175 | + (address_index * RIL_FEATURES_ADDRESS_COUNT)), RIL_FEATURES_ADDRESS_COUNT, agent->m); | ||
2176 | agent->m = m_new; | 2131 | agent->m = m_new; |
2177 | agent->n = n_new; | 2132 | agent->n = n_new; |
2178 | 2133 | ||