#define MIN_BW ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)
#define RIL_ACTION_INVALID -1
-#define RIL_FEATURES_ADDRESS_COUNT (0)// + GNUNET_ATS_QualityPropertiesCount)
-#define RIL_FEATURES_NETWORK_COUNT 2
-#define RIL_FEATURES_INIT_COUNT 1 + RIL_FEATURES_NETWORK_COUNT // + GNUNET_ATS_PreferenceCount
#define RIL_INTERVAL_EXPONENT 10
#define RIL_UTILITY_MAX (double) GNUNET_ATS_MaxBandwidth
#define RIL_DEFAULT_GRADIENT_STEP_SIZE 0.1
#define RIL_DEFAULT_TRACE_DECAY 0.5
#define RIL_DEFAULT_EXPLORE_RATIO 0.1
+#define RIL_DEFAULT_DIVISOR 10
#define RIL_DEFAULT_GLOBAL_REWARD_SHARE 0.5
#define RIL_INC_DEC_STEP_SIZE 1
*/
double lambda;
+ /**
+ * State space divisor
+ */
+ unsigned long long int divisor;
+
/**
* Ratio, with what probability an agent should explore in the e-greed policy
*/
*/
double global_discount_integrated;
- /**
- * State vector for networks for the current step
- */
- double *global_state_networks;
-
/**
* Lock for bulk operations
*/
return sum;
}
-//static void
-//envi_state_networks (struct GAS_RIL_Handle *solver)
-//{
-// int i;
-// struct RIL_Network net;
-// int overutilized_in;
-// int overutilized_out;
-//
-// for (i = 0; i < solver->networks_count; i++)
-// {
-// net = solver->network_entries[i];
-//
-// overutilized_in = net.bw_in_assigned > net.bw_in_available;
-// overutilized_out = net.bw_out_assigned > net.bw_out_available;
-//
-// solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 0] = ((double) net.bw_in_assigned / (double) net.bw_in_available)*10;
-// solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 1] = (double) overutilized_in;
-// solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 2] = ((double) net.bw_out_assigned / (double) net.bw_out_available)*10;
-// solver->global_state_networks[i * RIL_FEATURES_NETWORK_COUNT + 3] = (double) overutilized_out;
-// }
-//}
-
/**
* Allocates a state vector and fills it with the features present
* @param solver the solver handle
static double *
envi_get_state (struct GAS_RIL_Handle *solver, struct RIL_Peer_Agent *agent)
{
-// int i;
-// int k;
- double *state = GNUNET_malloc (sizeof (double) * agent->m);
-// struct RIL_Address_Wrapped *cur_address;
-// const double *preferences;
-// const double *properties;
- struct RIL_Network *net;
-
- //copy global networks state
-// for (i = 0; i < solver->networks_count * RIL_FEATURES_NETWORK_COUNT; i++)
-// {
-// state[i] = solver->global_state_networks[i];
-// }
-
- net = agent->address_inuse->solver_information;
-
- state[0] = 1;
- state[1] = (double) net->bw_in_assigned / (double) GNUNET_ATS_MaxBandwidth;
- state[2] = GNUNET_MIN((double) (net->bw_in_available - net->bw_in_assigned), 0) / (double) GNUNET_ATS_MaxBandwidth;
-
-// LOG(GNUNET_ERROR_TYPE_INFO, "get_state() state[0] = %f\n", state[0]);
-// LOG(GNUNET_ERROR_TYPE_INFO, "get_state() state[1] = %f\n", state[1]);
-//
-// LOG(GNUNET_ERROR_TYPE_INFO, "get_state() W / %08.3f %08.3f \\ \n", agent->W[0][0], agent->W[1][0]);
-// LOG(GNUNET_ERROR_TYPE_INFO, "get_state() W \\ %08.3f %08.3f / \n", agent->W[0][1], agent->W[1][1]);
+ double *state;
+ double y[2];
+ double x[2];
+ double d[2];
+ double sigma;
+ double f;
+ int m;
+ int i;
+ int k;
+ state = GNUNET_malloc (sizeof(agent->m));
- //get peer features
-// preferences = solver->plugin_envi->get_preferences (solver->plugin_envi->get_preference_cls,
-// &agent->peer);
-// for (k = 0; k < GNUNET_ATS_PreferenceCount; k++)
-// {
-// state[i++] = preferences[k];
-// }
+ y[0] = (double) agent->bw_out;
+ y[1] = (double) agent->bw_in;
- //get address specific features
-// for (cur_address = agent->addresses_head; NULL != cur_address; cur_address = cur_address->next)
-// {
-// //when changing the number of address specific state features, change RIL_FEATURES_ADDRESS_COUNT macro
-// state[i++] = cur_address->address_naked->active;
-// state[i++] = cur_address->address_naked->active ? agent->bw_in : 0;
-// state[i++] = cur_address->address_naked->active ? agent->bw_out : 0;
-// properties = solver->plugin_envi->get_property (solver->plugin_envi->get_property_cls,
-// cur_address->address_naked);
-// for (k = 0; k < GNUNET_ATS_QualityPropertiesCount; k++)
-// {
-// state[i++] = properties[k];
-// }
-// }
+ m = agent_address_get_index (agent, agent->address_inuse) * (solver->parameters.divisor+1) * (solver->parameters.divisor+1);
+ for (i = 0; i <= solver->parameters.divisor; i++)
+ {
+ for (k = 0; k <= solver->parameters.divisor; k++)
+ {
+ x[0] = i * GNUNET_ATS_MaxBandwidth / solver->parameters.divisor;
+ x[1] = k * GNUNET_ATS_MaxBandwidth / solver->parameters.divisor;
+ d[0] = x[0]-y[0];
+ d[1] = x[1]-y[1];
+ sigma = ((double) GNUNET_ATS_MaxBandwidth / 2) * M_SQRT2;
+ f = exp(-((d[0]*d[0] + d[1]*d[1]) / (2 * sigma * sigma)));
+ state[m++] = f;
+ }
+ }
return state;
}
agent->bw_out = MIN_BW;
agent->suggestion_issue = GNUNET_NO;
agent->n = RIL_ACTION_TYPE_NUM;
- agent->m = RIL_FEATURES_INIT_COUNT;
+ agent->m = 0;
agent->W = (double **) GNUNET_malloc (sizeof (double *) * agent->n);
for (i = 0; i < agent->n; i++)
{
GNUNET_assert(NULL != env->get_preferences);
GNUNET_assert(NULL != env->get_property);
+ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(env->cfg, "ats", "RIL_DIVISOR", &solver->parameters.divisor))
+ {
+ solver->parameters.divisor = RIL_DEFAULT_DIVISOR;
+ }
if (GNUNET_OK
!= GNUNET_CONFIGURATION_get_value_time (env->cfg, "ats", "RIL_STEP_TIME_MIN",
&solver->parameters.step_time_min))
solver->networks_count = env->network_count;
solver->network_entries = GNUNET_malloc (env->network_count * sizeof (struct RIL_Network));
solver->step_count = 0;
- solver->global_state_networks = GNUNET_malloc (solver->networks_count * RIL_FEATURES_NETWORK_COUNT * sizeof (double));
solver->done = GNUNET_NO;
for (c = 0; c < env->network_count; c++)
GNUNET_SCHEDULER_cancel (s->step_next_task_id);
}
GNUNET_free(s->network_entries);
- GNUNET_free(s->global_state_networks);
GNUNET_free(s);
return NULL;
GNUNET_CONTAINER_DLL_insert_tail(agent->addresses_head, agent->addresses_tail, address_wrapped);
//increase size of W
- m_new = agent->m + RIL_FEATURES_ADDRESS_COUNT;
+ m_new = agent->m + ((s->parameters.divisor+1) * (s->parameters.divisor+1));
m_old = agent->m;
n_new = agent->n + 1;
n_old = agent->n;
GNUNET_free(address_wrapped);
//decrease W
- m_new = agent->m - RIL_FEATURES_ADDRESS_COUNT;
+ m_new = agent->m - ((s->parameters.divisor+1) * (s->parameters.divisor+1));
n_new = agent->n - 1;
LOG(GNUNET_ERROR_TYPE_DEBUG, "first\n");
for (i = 0; i < agent->n; i++)
{
ril_cut_from_vector ((void **) &agent->W[i], sizeof(double),
- //((s->networks_count * RIL_FEATURES_NETWORK_COUNT)
- ((RIL_FEATURES_INIT_COUNT) //TODO! replace, when adding more networks
- + (address_index * RIL_FEATURES_ADDRESS_COUNT)), RIL_FEATURES_ADDRESS_COUNT, agent->m);
+ address_index * ((s->parameters.divisor+1) * (s->parameters.divisor+1)),
+ ((s->parameters.divisor+1) * (s->parameters.divisor+1)), agent->m);
}
GNUNET_free(agent->W[RIL_ACTION_TYPE_NUM + address_index]);
LOG(GNUNET_ERROR_TYPE_DEBUG, "second\n");
//decrease old state vector and eligibility vector
LOG(GNUNET_ERROR_TYPE_DEBUG, "third\n");
ril_cut_from_vector ((void **) &agent->s_old, sizeof(double),
- //((s->networks_count * RIL_FEATURES_NETWORK_COUNT)
- ((RIL_FEATURES_INIT_COUNT) //TODO! replace when adding more networks
- + (address_index * RIL_FEATURES_ADDRESS_COUNT)), RIL_FEATURES_ADDRESS_COUNT, agent->m);
+ address_index * ((s->parameters.divisor+1) * (s->parameters.divisor+1)),
+ ((s->parameters.divisor+1) * (s->parameters.divisor+1)), agent->m);
ril_cut_from_vector ((void **) &agent->e, sizeof(double),
- //((s->networks_count * RIL_FEATURES_NETWORK_COUNT)
- ((RIL_FEATURES_INIT_COUNT) //TODO! replace when adding more networks
- + (address_index * RIL_FEATURES_ADDRESS_COUNT)), RIL_FEATURES_ADDRESS_COUNT, agent->m);
+ address_index * ((s->parameters.divisor+1) * (s->parameters.divisor+1)),
+ ((s->parameters.divisor+1) * (s->parameters.divisor+1)), agent->m);
agent->m = m_new;
agent->n = n_new;