aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFabian Oehlmann <oehlmann@in.tum.de>2013-12-27 16:01:59 +0000
committerFabian Oehlmann <oehlmann@in.tum.de>2013-12-27 16:01:59 +0000
commitfbfd23141c29c3cb91a72261976963fd497407e7 (patch)
tree676cf3fdf422db8c4b4a1c6ad58ca3231bd83dbe /src
parent394634143752c70d698b01ecaaa62486957aac2f (diff)
downloadgnunet-fbfd23141c29c3cb91a72261976963fd497407e7.tar.gz
gnunet-fbfd23141c29c3cb91a72261976963fd497407e7.zip
changed function approximation to radial basis functions
Diffstat (limited to 'src')
-rwxr-xr-xsrc/ats/plugin_ats_ril.c135
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
765static double * 741static double *
766envi_get_state (struct GAS_RIL_Handle *solver, struct RIL_Peer_Agent *agent) 742envi_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