aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFabian Oehlmann <oehlmann@in.tum.de>2013-09-25 11:51:20 +0000
committerFabian Oehlmann <oehlmann@in.tum.de>2013-09-25 11:51:20 +0000
commit9b5a44b44ec66dc9cb00a1b053b4cb62fc1573d0 (patch)
tree721c8e826272a089ba2370f99cfa889f9da9b034 /src
parentade9098f026f851b7eea0b0d67c5a2e20c0c4501 (diff)
downloadgnunet-9b5a44b44ec66dc9cb00a1b053b4cb62fc1573d0.tar.gz
gnunet-9b5a44b44ec66dc9cb00a1b053b4cb62fc1573d0.zip
ats_ril: debugged to run first tests
Diffstat (limited to 'src')
-rwxr-xr-xsrc/ats/gnunet-service-ats-solver_ril.c184
1 files changed, 124 insertions, 60 deletions
diff --git a/src/ats/gnunet-service-ats-solver_ril.c b/src/ats/gnunet-service-ats-solver_ril.c
index a47f1ff9a..3c7bc9be0 100755
--- a/src/ats/gnunet-service-ats-solver_ril.c
+++ b/src/ats/gnunet-service-ats-solver_ril.c
@@ -55,7 +55,8 @@ enum RIL_Action_Type
55 55
56enum RIL_Algorithm 56enum RIL_Algorithm
57{ 57{
58 RIL_ALGO_SARSA, RIL_ALGO_Q 58 RIL_ALGO_SARSA = 0,
59 RIL_ALGO_Q = 1
59}; 60};
60 61
61enum RIL_E_Modification 62enum RIL_E_Modification
@@ -315,7 +316,7 @@ agent_estimate_q (struct RIL_Peer_Agent *agent, double *state, int action)
315 316
316 for (i = 0; i < agent->m; i++) 317 for (i = 0; i < agent->m; i++)
317 { 318 {
318 result += state[i] * (agent->W)[agent->m][action]; 319 result += state[i] * agent->W[action][i];
319 } 320 }
320 321
321 return result; 322 return result;
@@ -353,7 +354,7 @@ agent_get_action_best (struct RIL_Peer_Agent *agent, double *state)
353 int i; 354 int i;
354 int max_i = -1; 355 int max_i = -1;
355 double cur_q; 356 double cur_q;
356 double max_q = DBL_MIN; 357 double max_q = -DBL_MAX;
357 358
358 for (i = 0; i < agent->n; i++) 359 for (i = 0; i < agent->n; i++)
359 { 360 {
@@ -397,8 +398,9 @@ agent_update_weights (struct RIL_Peer_Agent *agent,
397{ 398{
398 int i; 399 int i;
399 double delta; 400 double delta;
400 double *theta = (agent->W)[agent->a_old]; 401 double *theta = agent->W[agent->a_old];
401 402
403 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "agent_update_weights() MUH a_old = %d\n", agent->a_old);
402 delta = reward + agent_estimate_q (agent, s_next, a_prime) 404 delta = reward + agent_estimate_q (agent, s_next, a_prime)
403 - agent_estimate_q (agent, agent->s_old, agent->a_old); 405 - agent_estimate_q (agent, agent->s_old, agent->a_old);
404 for (i = 0; i < agent->m; i++) 406 for (i = 0; i < agent->m; i++)
@@ -457,13 +459,13 @@ envi_get_state (struct GAS_RIL_Handle *solver)
457 struct RIL_Network *net; 459 struct RIL_Network *net;
458 double *state = GNUNET_malloc (sizeof (double) * solver->networks_count * 4); 460 double *state = GNUNET_malloc (sizeof (double) * solver->networks_count * 4);
459 461
460 for (i = 0; i < solver->networks_count; i += 4) 462 for (i = 0; i < solver->networks_count; i++)
461 { 463 {
462 net = (&solver->network_entries)[i]; 464 net = &solver->network_entries[i];
463 state[i] = (double) net->bw_in_assigned; 465 state[i*4 + 0] = (double) net->bw_in_assigned;
464 state[i + 1] = (double) net->bw_in_available; 466 state[i*4 + 1] = (double) net->bw_in_available;
465 state[i + 2] = (double) net->bw_out_assigned; 467 state[i*4 + 2] = (double) net->bw_out_assigned;
466 state[i + 3] = (double) net->bw_out_available; 468 state[i*4 + 3] = (double) net->bw_out_available;
467 } 469 }
468 470
469 return state; 471 return state;
@@ -574,6 +576,9 @@ agent_step (struct RIL_Peer_Agent *agent)
574 s_next = envi_get_state (agent->envi); 576 s_next = envi_get_state (agent->envi);
575 reward = envi_get_reward (agent->envi, agent); 577 reward = envi_get_reward (agent->envi, agent);
576 578
579 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "agent_step() with algorithm %s\n",
580 agent->envi->parameters.algorithm ? "Q" : "SARSA");
581
577 switch (agent->envi->parameters.algorithm) 582 switch (agent->envi->parameters.algorithm)
578 { 583 {
579 case RIL_ALGO_SARSA: 584 case RIL_ALGO_SARSA:
@@ -586,14 +591,16 @@ agent_step (struct RIL_Peer_Agent *agent)
586 { 591 {
587 a_next = agent_get_action_best (agent, s_next); 592 a_next = agent_get_action_best (agent, s_next);
588 } 593 }
589 //updates weights with selected action (on-policy) 594 //updates weights with selected action (on-policy), if not first step
590 agent_update_weights (agent, reward, s_next, a_next); 595 if (-1 != agent->a_old)
596 agent_update_weights (agent, reward, s_next, a_next);
591 break; 597 break;
592 598
593 case RIL_ALGO_Q: 599 case RIL_ALGO_Q:
594 //updates weights with best action, disregarding actually selected action (off-policy) 600 //updates weights with best action, disregarding actually selected action (off-policy), if not first step
595 a_next = agent_get_action_best (agent, s_next); 601 a_next = agent_get_action_best (agent, s_next);
596 agent_update_weights (agent, reward, s_next, a_next); 602 if (-1 != agent->a_old)
603 agent_update_weights (agent, reward, s_next, a_next);
597 if (agent_decide_exploration (agent)) 604 if (agent_decide_exploration (agent))
598 { 605 {
599 a_next = agent_get_action_explore (agent, s_next); 606 a_next = agent_get_action_explore (agent, s_next);
@@ -670,7 +677,7 @@ agent_init (void *s, const struct GNUNET_PeerIdentity *peer)
670 agent->W = (double **) GNUNET_malloc (sizeof (double) * agent->n); 677 agent->W = (double **) GNUNET_malloc (sizeof (double) * agent->n);
671 for (i = 0; i < agent->n; i++) 678 for (i = 0; i < agent->n; i++)
672 { 679 {
673 (agent->W)[i] = (double *) GNUNET_malloc (sizeof (double) * agent->m); 680 agent->W[i] = (double *) GNUNET_malloc (sizeof (double) * agent->m);
674 } 681 }
675 agent->a_old = -1; 682 agent->a_old = -1;
676 agent->e = (double *) GNUNET_malloc (sizeof (double) * agent->m); 683 agent->e = (double *) GNUNET_malloc (sizeof (double) * agent->m);
@@ -694,13 +701,32 @@ agent_die (struct GAS_RIL_Handle *solver, struct RIL_Peer_Agent *agent)
694 701
695 for (i = 0; i < agent->n; i++) 702 for (i = 0; i < agent->n; i++)
696 { 703 {
697 GNUNET_free((agent->W)[i]); 704 GNUNET_free(agent->W[i]);
698 } 705 }
699 GNUNET_free(agent->W); 706 GNUNET_free(agent->W);
700 GNUNET_free(agent->e); 707 GNUNET_free(agent->e);
701 GNUNET_free(agent->s_old); 708 GNUNET_free(agent->s_old);
702} 709}
703 710
711static void
712ril_remove_agent (struct GAS_RIL_Handle *s, struct RIL_Peer_Agent *agent)
713{
714 struct RIL_Peer_Agent *cur_agent;
715 struct RIL_Peer_Agent *next_agent;
716
717 cur_agent = s->agents_head;
718 while (NULL != cur_agent)
719 {
720 next_agent = cur_agent->next;
721
722 if (agent == cur_agent)
723 GNUNET_CONTAINER_DLL_remove(s->agents_head, s->agents_tail, cur_agent);
724 agent_die (s, cur_agent);
725
726 cur_agent = next_agent;
727 }
728}
729
704/** 730/**
705 * Counts the (active) agents 731 * Counts the (active) agents
706 * @param solver solver handle 732 * @param solver solver handle
@@ -728,11 +754,13 @@ ril_count_agents (struct GAS_RIL_Handle *solver, int active_only)
728 * Returns the agent for a peer 754 * Returns the agent for a peer
729 * @param s solver handle 755 * @param s solver handle
730 * @param peer identity of the peer 756 * @param peer identity of the peer
757 * @param create whether to create an agent if none is allocated yet
731 * @return agent 758 * @return agent
732 */ 759 */
733static struct RIL_Peer_Agent * 760static struct RIL_Peer_Agent *
734ril_get_agent (struct GAS_RIL_Handle *solver, 761ril_get_agent (struct GAS_RIL_Handle *solver,
735 const struct GNUNET_PeerIdentity *peer) 762 const struct GNUNET_PeerIdentity *peer,
763 int create)
736{ 764{
737 struct RIL_Peer_Agent *cur; 765 struct RIL_Peer_Agent *cur;
738 766
@@ -744,7 +772,19 @@ ril_get_agent (struct GAS_RIL_Handle *solver,
744 } 772 }
745 } 773 }
746 774
747 return agent_init (solver, peer); 775 if (create)
776 return agent_init (solver, peer);
777 return NULL;
778}
779
780static int
781ril_network_is_active (struct RIL_Network *network)
782{
783 uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__);
784
785 if (network->bw_out_available < min_bw)
786 return GNUNET_NO;
787 return GNUNET_YES;
748} 788}
749 789
750/** 790/**
@@ -760,23 +800,25 @@ ril_init_agents_it (void *cls, const struct GNUNET_HashCode *key, void *value)
760{ 800{
761 struct GAS_RIL_Handle *solver = cls; 801 struct GAS_RIL_Handle *solver = cls;
762 struct ATS_Address *address = value; 802 struct ATS_Address *address = value;
763 struct RIL_Peer_Agent *agent; 803 struct RIL_Peer_Agent *agent = NULL;
764 uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__); 804 uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__);
765 805
766 agent = ril_get_agent (solver, &address->peer); 806 if (ril_network_is_active(address->solver_information))
807 {
808 agent = ril_get_agent (solver, &address->peer, GNUNET_YES);
767 809
768 GNUNET_assert(NULL != agent); 810 GNUNET_assert(NULL != agent);
769 811
770 if (NULL == agent->address) 812 if (NULL == agent->address)
771 { 813 {
772 agent->address = address; 814 agent->address = address;
773 agent->address->active = GNUNET_YES; 815 agent->address->active = GNUNET_YES;
774 agent->bw_in = min_bw; 816 agent->bw_in = min_bw;
775 agent->address->assigned_bw_in.value__ = htonl (min_bw); 817 agent->address->assigned_bw_in.value__ = htonl (min_bw);
776 agent->bw_out = min_bw; 818 agent->bw_out = min_bw;
777 agent->address->assigned_bw_out.value__ = htonl (min_bw); 819 agent->address->assigned_bw_out.value__ = htonl (min_bw);
820 }
778 } 821 }
779
780 return GNUNET_YES; 822 return GNUNET_YES;
781} 823}
782 824
@@ -791,6 +833,7 @@ static struct RIL_Network *
791ril_get_network (struct GAS_RIL_Handle *s, uint32_t type) 833ril_get_network (struct GAS_RIL_Handle *s, uint32_t type)
792{ 834{
793 int i; 835 int i;
836
794 for (i = 0; i < s->networks_count; i++) 837 for (i = 0; i < s->networks_count; i++)
795 { 838 {
796 if (s->network_entries[i].type == type) { 839 if (s->network_entries[i].type == type) {
@@ -893,13 +936,10 @@ GAS_ril_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
893 solver->step_time = RIL_DEFAULT_STEP_TIME; 936 solver->step_time = RIL_DEFAULT_STEP_TIME;
894 } 937 }
895 if (GNUNET_OK 938 if (GNUNET_OK
896 != GNUNET_CONFIGURATION_get_value_string (cfg, "ats", "RIL_ALGORITHM", 939 == GNUNET_CONFIGURATION_get_value_string (cfg, "ats", "RIL_ALGORITHM",
897 &string)) 940 &string) && NULL != string && 0 == strcmp (string, "SARSA"))
898 { 941 {
899 if (0 == strcmp (string, "SARSA")) 942 solver->parameters.algorithm = RIL_ALGO_SARSA;
900 {
901 solver->parameters.algorithm = RIL_ALGO_SARSA;
902 }
903 } 943 }
904 else 944 else
905 { 945 {
@@ -910,7 +950,6 @@ GAS_ril_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
910 &tmp)) 950 &tmp))
911 { 951 {
912 solver->parameters.gamma = (double) tmp / 100; 952 solver->parameters.gamma = (double) tmp / 100;
913 ;
914 } 953 }
915 else 954 else
916 { 955 {
@@ -921,7 +960,6 @@ GAS_ril_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
921 "RIL_GRADIENT_STEP_SIZE", &tmp)) 960 "RIL_GRADIENT_STEP_SIZE", &tmp))
922 { 961 {
923 solver->parameters.alpha = (double) tmp / 100; 962 solver->parameters.alpha = (double) tmp / 100;
924 ;
925 } 963 }
926 else 964 else
927 { 965 {
@@ -932,7 +970,6 @@ GAS_ril_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
932 &tmp)) 970 &tmp))
933 { 971 {
934 solver->parameters.lambda = (double) tmp / 100; 972 solver->parameters.lambda = (double) tmp / 100;
935 ;
936 } 973 }
937 else 974 else
938 { 975 {
@@ -964,13 +1001,6 @@ GAS_ril_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
964 cur->bw_out_assigned = 0; 1001 cur->bw_out_assigned = 0;
965 } 1002 }
966 1003
967 c = GNUNET_CONTAINER_multihashmap_iterate (addresses, &ril_init_agents_it,
968 solver);
969
970 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
971 "API_init() Solving ATS for %d addresses and %d peers\n", c,
972 ril_count_agents(solver, GNUNET_NO));
973
974 solver->next_step = GNUNET_SCHEDULER_add_delayed ( 1004 solver->next_step = GNUNET_SCHEDULER_add_delayed (
975 GNUNET_TIME_relative_multiply (GNUNET_TIME_relative_get_millisecond_ (), 1005 GNUNET_TIME_relative_multiply (GNUNET_TIME_relative_get_millisecond_ (),
976 1000), &ril_periodic_step, solver); 1006 1000), &ril_periodic_step, solver);
@@ -1030,6 +1060,8 @@ GAS_ril_address_add (void *solver,
1030 * and action vector 1060 * and action vector
1031 */ 1061 */
1032 1062
1063 address->solver_information = ril_get_network(s, network);
1064
1033 /* 1065 /*
1034 * reiterate all addresses, create new agent if necessary and give the agent the address 1066 * reiterate all addresses, create new agent if necessary and give the agent the address
1035 */ 1067 */
@@ -1067,7 +1099,13 @@ GAS_ril_address_delete (void *solver,
1067 struct GAS_RIL_Handle *s = solver; 1099 struct GAS_RIL_Handle *s = solver;
1068 struct RIL_Peer_Agent *agent; 1100 struct RIL_Peer_Agent *agent;
1069 1101
1070 agent = ril_get_agent (s, &address->peer); 1102 agent = ril_get_agent (s, &address->peer, GNUNET_NO);
1103
1104 if (NULL == agent)
1105 {
1106 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "API_address_delete() deleting address for unallocated agent");
1107 return;
1108 }
1071 1109
1072 if (0 == memcmp (agent->address->addr, address->addr, address->addr_len)) //if used address deleted 1110 if (0 == memcmp (agent->address->addr, address->addr, address->addr_len)) //if used address deleted
1073 { 1111 {
@@ -1077,6 +1115,7 @@ GAS_ril_address_delete (void *solver,
1077 if (NULL == agent->address) //no other address available 1115 if (NULL == agent->address) //no other address available
1078 { 1116 {
1079 agent->active = GNUNET_NO; 1117 agent->active = GNUNET_NO;
1118 ril_remove_agent (solver, agent);
1080 } 1119 }
1081 } 1120 }
1082 1121
@@ -1186,23 +1225,40 @@ GAS_ril_address_change_network (void *solver,
1186 GNUNET_ATS_print_network_type (current_network), 1225 GNUNET_ATS_print_network_type (current_network),
1187 GNUNET_ATS_print_network_type (new_network)); 1226 GNUNET_ATS_print_network_type (new_network));
1188 1227
1189 agent = ril_get_agent (s, &address->peer); 1228 address->solver_information = ril_get_network(solver, new_network);
1190 1229
1191 if (address->active) 1230 if (address->active)
1192 { 1231 {
1232 agent = ril_get_agent(solver, &address->peer, GNUNET_NO);
1233
1193 //remove from old network 1234 //remove from old network
1194 net = ril_get_network (s, current_network); 1235 net = ril_get_network (s, current_network);
1195 net->bw_in_assigned -= agent->bw_in; 1236 net->bw_in_assigned -= agent->bw_in;
1196 net->bw_out_assigned -= agent->bw_out; 1237 net->bw_out_assigned -= agent->bw_out;
1197 1238
1198 //add to new network 1239 if (ril_network_is_active(ril_get_network(s, new_network)))
1199 net = ril_get_network (s, new_network); 1240 {
1200 net->bw_in_assigned += agent->bw_in; 1241 //add to new network
1201 net->bw_out_assigned += agent->bw_out; 1242 net = ril_get_network (s, new_network);
1202 1243 net->bw_in_assigned += agent->bw_in;
1203 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1244 net->bw_out_assigned += agent->bw_out;
1204 "API_address_change_network() Moved %d inbound and %d " 1245
1205 "outbound\n", agent->bw_in, agent->bw_out); 1246 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
1247 "API_address_change_network() Moved %d inbound and %d "
1248 "outbound\n", agent->bw_in, agent->bw_out);
1249 }
1250 else //new network for this address is not active => address must not be considered
1251 {
1252 address->active = GNUNET_NO;
1253 agent->address = NULL; //delete address
1254 GNUNET_CONTAINER_multihashmap_iterate (s->addresses, &ril_init_agents_it,
1255 solver); //put another address
1256 if (NULL == agent->address) //no other address available
1257 {
1258 agent->active = GNUNET_NO;
1259 ril_remove_agent(s, agent);
1260 }
1261 }
1206 } 1262 }
1207} 1263}
1208 1264
@@ -1246,7 +1302,8 @@ GAS_ril_bulk_start (void *solver)
1246 * bandwidth assignment triggered anyway. Therefore, changes to addresses can come and go as 1302 * bandwidth assignment triggered anyway. Therefore, changes to addresses can come and go as
1247 * they want. Consideration: Step-pause during bulk-start-stop period... 1303 * they want. Consideration: Step-pause during bulk-start-stop period...
1248 */ 1304 */
1249 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "API_bulk_start()\n"); 1305
1306 //GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "API_bulk_start()\n");
1250} 1307}
1251 1308
1252/** 1309/**
@@ -1259,7 +1316,8 @@ GAS_ril_bulk_stop (void *solver)
1259 /* 1316 /*
1260 * bulk counter down, see bulk_start() 1317 * bulk counter down, see bulk_start()
1261 */ 1318 */
1262 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "API_bulk_stop()\n"); 1319
1320 //GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "API_bulk_stop()\n");
1263} 1321}
1264 1322
1265/** 1323/**
@@ -1278,7 +1336,13 @@ GAS_ril_get_preferred_address (void *solver,
1278 struct GAS_RIL_Handle *s = solver; 1336 struct GAS_RIL_Handle *s = solver;
1279 struct RIL_Peer_Agent *agent; 1337 struct RIL_Peer_Agent *agent;
1280 1338
1281 agent = ril_get_agent (s, peer); 1339 agent = ril_get_agent (s, peer, GNUNET_NO);
1340
1341 if (NULL == agent)
1342 {
1343 return NULL;
1344 }
1345
1282 agent->active = GNUNET_YES; 1346 agent->active = GNUNET_YES;
1283 1347
1284 GNUNET_assert(NULL != agent->address); 1348 GNUNET_assert(NULL != agent->address);
@@ -1303,7 +1367,7 @@ GAS_ril_stop_get_preferred_address (void *solver,
1303 struct GAS_RIL_Handle *s = solver; 1367 struct GAS_RIL_Handle *s = solver;
1304 struct RIL_Peer_Agent *agent; 1368 struct RIL_Peer_Agent *agent;
1305 1369
1306 agent = ril_get_agent (s, peer); 1370 agent = ril_get_agent (s, peer, GNUNET_NO);
1307 agent->active = GNUNET_NO; 1371 agent->active = GNUNET_NO;
1308 1372
1309 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1373 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,