aboutsummaryrefslogtreecommitdiff
path: root/src/ats
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-01-18 16:47:05 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-01-18 16:47:05 +0000
commitcc264ce5079a3b17eea5df4fba1fd2c775d4fb6b (patch)
tree8ca7a7b22f647d8b69dd9a5a5b498f87cdbf4ae2 /src/ats
parentbf2b879fe037bb349433db85a4a0cb4b42bfaf6e (diff)
downloadgnunet-cc264ce5079a3b17eea5df4fba1fd2c775d4fb6b.tar.gz
gnunet-cc264ce5079a3b17eea5df4fba1fd2c775d4fb6b.zip
- more
Diffstat (limited to 'src/ats')
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.c55
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.h3
2 files changed, 54 insertions, 4 deletions
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c
index 3899e126a..b5f0bed8e 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.c
+++ b/src/ats/gnunet-service-ats_addresses_mlp.c
@@ -231,7 +231,7 @@ create_constraint_it (void *cls, const GNUNET_HashCode * key, void *value)
231 mlp->ci++; 231 mlp->ci++;
232 232
233 /* c 3) minimum bandwidth 233 /* c 3) minimum bandwidth
234 * b_t + (-n_t * b_min) >= 0 234 * b_t + (-n_t * b_min) >= 0
235 */ 235 */
236 236
237 row_index = glp_add_rows (mlp->prob, 1); 237 row_index = glp_add_rows (mlp->prob, 1);
@@ -250,7 +250,7 @@ create_constraint_it (void *cls, const GNUNET_HashCode * key, void *value)
250 mlp->ci++; 250 mlp->ci++;
251 251
252 /* c 4) minimum connections 252 /* c 4) minimum connections
253 * (1)*n_1 + ... + (1)*n_m >= n_min 253 * (1)*n_1 + ... + (1)*n_m >= n_min
254 */ 254 */
255 mlp->ia[mlp->ci] = mlp->r_c4; 255 mlp->ia[mlp->ci] = mlp->r_c4;
256 mlp->ja[mlp->ci] = mlpi->c_n; 256 mlp->ja[mlp->ci] = mlpi->c_n;
@@ -271,8 +271,8 @@ create_constraint_it (void *cls, const GNUNET_HashCode * key, void *value)
271static void 271static void
272mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses) 272mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses)
273{ 273{
274 //double M = VERY_BIG_DOUBLE_VALUE;
275 unsigned int n_addresses; 274 unsigned int n_addresses;
275 int row_index;
276 276
277 /* Problem matrix*/ 277 /* Problem matrix*/
278 n_addresses = GNUNET_CONTAINER_multihashmap_size(addresses); 278 n_addresses = GNUNET_CONTAINER_multihashmap_size(addresses);
@@ -338,7 +338,38 @@ mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CON
338 338
339 GNUNET_CONTAINER_multihashmap_iterate (addresses, create_constraint_it, mlp); 339 GNUNET_CONTAINER_multihashmap_iterate (addresses, create_constraint_it, mlp);
340 340
341 /* Adding constraint rows
342 * This constraints are kind of "for all peers"
343 * Feasibility constraints:
344 *
345 * c 2) 1 address per peer
346 * sum (n_p1_1 + ... + n_p1_n) = 1
347 */
348
349 /* Adding rows for c 2) */
350 row_index = glp_add_rows (mlp->prob, mlp->c_p);
351
352 struct ATS_Peer * peer = mlp->peer_head;
353 while (peer != NULL)
354 {
355 struct ATS_Address *addr = peer->head;
356 struct MLP_information *mlpi = (struct MLP_information *) addr->mlp_information;
357 /* Adding row for c 2) */
358 /* Set row bound == 1 */
359 glp_set_row_bnds (mlp->prob, row_index, GLP_FX, 1.0, 1.0);
360
361 while (addr != NULL)
362 {
363 ia[mlp->ci] = row_index;
364 ja[mlp->ci] = mlpi->c_n;
365 ar[mlp->ci] = 1;
366 mlp->ci++;
367
368 addr = addr->next;
369 }
341 370
371 peer = peer->next;
372 }
342} 373}
343 374
344/** 375/**
@@ -834,6 +865,7 @@ GAS_mlp_address_update (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_Mult
834 GNUNET_assert(address->next == NULL); 865 GNUNET_assert(address->next == NULL);
835 GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address); 866 GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
836 GNUNET_CONTAINER_DLL_insert (mlp->peer_head, mlp->peer_tail, peer); 867 GNUNET_CONTAINER_DLL_insert (mlp->peer_head, mlp->peer_tail, peer);
868 mlp->c_p ++;
837 } 869 }
838 else 870 else
839 { 871 {
@@ -919,7 +951,7 @@ GAS_mlp_address_delete (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_Mult
919 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting address for `%s'\n", GNUNET_i2s (&address->peer)); 951 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting address for `%s'\n", GNUNET_i2s (&address->peer));
920#endif 952#endif
921 GNUNET_CONTAINER_DLL_remove (head->head, head->tail, address); 953 GNUNET_CONTAINER_DLL_remove (head->head, head->tail, address);
922 954 mlp->c_p --;
923 if ((head->head == NULL) && (head->tail == NULL)) 955 if ((head->head == NULL) && (head->tail == NULL))
924 { 956 {
925 /* No address for peer left, remove peer */ 957 /* No address for peer left, remove peer */
@@ -957,12 +989,27 @@ GAS_mlp_address_change_preference (struct GAS_MLP_Handle *mlp, struct GNUNET_CON
957void 989void
958GAS_mlp_done (struct GAS_MLP_Handle *mlp) 990GAS_mlp_done (struct GAS_MLP_Handle *mlp)
959{ 991{
992 struct ATS_Peer * peer;
993 struct ATS_Peer * tmp;
994
960 if (mlp->mlp_task != GNUNET_SCHEDULER_NO_TASK) 995 if (mlp->mlp_task != GNUNET_SCHEDULER_NO_TASK)
961 { 996 {
962 GNUNET_SCHEDULER_cancel(mlp->mlp_task); 997 GNUNET_SCHEDULER_cancel(mlp->mlp_task);
963 mlp->mlp_task = GNUNET_SCHEDULER_NO_TASK; 998 mlp->mlp_task = GNUNET_SCHEDULER_NO_TASK;
964 } 999 }
965 1000
1001 /* clean up peer list */
1002 if (mlp != NULL)
1003 {
1004 peer = mlp->peer_head;
1005 while (peer != NULL)
1006 {
1007 GNUNET_CONTAINER_DLL_remove(mlp->peer_head, mlp->peer_tail, peer);
1008 tmp = peer->next;
1009 GNUNET_free (peer);
1010 peer = tmp;
1011 }
1012 }
966 mlp_delete_problem (mlp); 1013 mlp_delete_problem (mlp);
967 1014
968 /* Clean up GLPK environment */ 1015 /* Clean up GLPK environment */
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h
index 2383f24ef..f410339eb 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.h
+++ b/src/ats/gnunet-service-ats_addresses_mlp.h
@@ -149,6 +149,9 @@ struct GAS_MLP_Handle
149 struct ATS_Peer *peer_head; 149 struct ATS_Peer *peer_head;
150 struct ATS_Peer *peer_tail; 150 struct ATS_Peer *peer_tail;
151 151
152 /* Number of peers */
153 unsigned int c_p;
154
152 /* current problem matrix */ 155 /* current problem matrix */
153 /* row index array */ 156 /* row index array */
154 int *ia; 157 int *ia;