diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2012-01-18 16:47:05 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2012-01-18 16:47:05 +0000 |
commit | cc264ce5079a3b17eea5df4fba1fd2c775d4fb6b (patch) | |
tree | 8ca7a7b22f647d8b69dd9a5a5b498f87cdbf4ae2 /src/ats | |
parent | bf2b879fe037bb349433db85a4a0cb4b42bfaf6e (diff) | |
download | gnunet-cc264ce5079a3b17eea5df4fba1fd2c775d4fb6b.tar.gz gnunet-cc264ce5079a3b17eea5df4fba1fd2c775d4fb6b.zip |
- more
Diffstat (limited to 'src/ats')
-rw-r--r-- | src/ats/gnunet-service-ats_addresses_mlp.c | 55 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses_mlp.h | 3 |
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) | |||
271 | static void | 271 | static void |
272 | mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses) | 272 | mlp_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 | |||
957 | void | 989 | void |
958 | GAS_mlp_done (struct GAS_MLP_Handle *mlp) | 990 | GAS_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; |