[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r19243 - gnunet/src/ats
From: |
gnunet |
Subject: |
[GNUnet-SVN] r19243 - gnunet/src/ats |
Date: |
Wed, 18 Jan 2012 15:42:15 +0100 |
Author: wachs
Date: 2012-01-18 15:42:15 +0100 (Wed, 18 Jan 2012)
New Revision: 19243
Modified:
gnunet/src/ats/gnunet-service-ats_addresses.c
gnunet/src/ats/gnunet-service-ats_addresses.h
gnunet/src/ats/gnunet-service-ats_addresses_mlp.c
gnunet/src/ats/gnunet-service-ats_addresses_mlp.h
gnunet/src/ats/test_ats_mlp.c
Log:
- functionality for "for all peers" constraints
Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c 2012-01-18 14:39:14 UTC
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c 2012-01-18 14:42:15 UTC
(rev 19243)
@@ -154,7 +154,9 @@
memcpy (&aa[1], plugin_addr, plugin_addr_len);
aa->plugin = GNUNET_strdup (plugin_name);
aa->session_id = session_id;
-
+ aa->mlp_information = NULL;
+ aa->next = NULL;
+ aa->prev = NULL;
return aa;
}
Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h 2012-01-18 14:39:14 UTC
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h 2012-01-18 14:42:15 UTC
(rev 19243)
@@ -34,6 +34,10 @@
struct ATS_Address
{
+ struct ATS_Address *next;
+
+ struct ATS_Address *prev;
+
struct GNUNET_PeerIdentity peer;
size_t addr_len;
Modified: gnunet/src/ats/gnunet-service-ats_addresses_mlp.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses_mlp.c 2012-01-18 14:39:14 UTC
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses_mlp.c 2012-01-18 14:42:15 UTC
(rev 19243)
@@ -34,7 +34,7 @@
#endif
#include "float.h"
-#define DEBUG_ATS GNUNET_YES
+#define DEBUG_ATS GNUNET_NO
/* A very big value */
#define M DBL_MAX
@@ -325,12 +325,14 @@
double *ar= GNUNET_malloc (pi * sizeof (double));
mlp->ar = ar;
- /* Adding constraint rows */
- /* Feasibility constraints */
-
- /* c 1) bandwidth capping */
- /* c 3) minimum bandwidth */
- /* c 4) minimum number of connections */
+ /* Adding constraint rows
+ * This constraints are kind of "for all addresses"
+ * Feasibility constraints:
+ *
+ * c 1) bandwidth capping
+ * c 3) minimum bandwidth
+ * c 4) minimum number of connections
+ */
mlp->r_c4 = glp_add_rows (mlp->prob, 1);
glp_set_row_bnds (mlp->prob, mlp->r_c4, GLP_LO, mlp->n_min, 0.0);
@@ -811,6 +813,37 @@
address->mlp_information = mlpi;
mlp->addr_in_problem ++;
+ /* Check for and add peer */
+ struct ATS_Peer *peer = mlp->peer_head;
+ while (peer != NULL)
+ {
+ if (0 == memcmp (&address->peer, &peer->id, sizeof (struct
GNUNET_PeerIdentity)))
+ break;
+ peer = peer->next;
+ }
+ if (peer == NULL)
+ {
+#if DEBUG_ATS
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding new peer `%s'\n",
GNUNET_i2s (&address->peer));
+#endif
+ peer = GNUNET_malloc (sizeof (struct ATS_Peer));
+ peer->head = NULL;
+ peer->tail = NULL;
+ memcpy (&peer->id, &address->peer, sizeof (struct GNUNET_PeerIdentity));
+ GNUNET_assert(address->prev == NULL);
+ GNUNET_assert(address->next == NULL);
+ GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
+ GNUNET_CONTAINER_DLL_insert (mlp->peer_head, mlp->peer_tail, peer);
+ }
+ else
+ {
+#if DEBUG_ATS
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding address to peer `%s'\n",
GNUNET_i2s (&address->peer));
+#endif
+ GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
+ }
+
+
/* Add bandwidth column */
col = glp_add_cols (mlp->prob, 2);
mlpi->c_b = col;
@@ -836,9 +869,13 @@
glp_set_col_kind (mlp->prob, mlpi->c_n, GLP_IV);
/* Objective function coefficient == 0 */
glp_set_obj_coef (mlp->prob, mlpi->c_n, 0);
-
- /* Add */
}
+ else
+ {
+#if DEBUG_ATS
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Updating existing address to peer
`%s'\n", GNUNET_i2s (&address->peer));
+#endif
+ }
/* Recalculate */
if (new == GNUNET_YES)
@@ -869,6 +906,30 @@
mlp->addr_in_problem --;
}
+ /* Remove from peer list */
+ struct ATS_Peer *head = mlp->peer_head;
+ while (head != NULL)
+ {
+ if (0 == memcmp (&address->peer, &head->id, sizeof (struct
GNUNET_PeerIdentity)))
+ break;
+ head = head->next;
+ }
+ GNUNET_assert (head != NULL);
+#if DEBUG_ATS
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting address for `%s'\n",
GNUNET_i2s (&address->peer));
+#endif
+ GNUNET_CONTAINER_DLL_remove (head->head, head->tail, address);
+
+ if ((head->head == NULL) && (head->tail == NULL))
+ {
+ /* No address for peer left, remove peer */
+#if DEBUG_ATS
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting peer `%s'\n", GNUNET_i2s
(&address->peer));
+#endif
+ GNUNET_CONTAINER_DLL_remove (mlp->peer_head, mlp->peer_tail, head);
+ GNUNET_free (head);
+ }
+
/* Update problem */
/* Recalculate */
Modified: gnunet/src/ats/gnunet-service-ats_addresses_mlp.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses_mlp.h 2012-01-18 14:39:14 UTC
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses_mlp.h 2012-01-18 14:42:15 UTC
(rev 19243)
@@ -40,6 +40,17 @@
#define MLP_MAX_EXEC_DURATION
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3)
#define MLP_MAX_ITERATIONS INT_MAX
+struct ATS_Peer
+{
+ struct ATS_Peer *next;
+ struct ATS_Peer *prev;
+
+ struct GNUNET_PeerIdentity id;
+
+ struct ATS_Address *head;
+ struct ATS_Address *tail;
+};
+
/**
* MLP Handle
*/
@@ -135,6 +146,9 @@
/* Information about the problem */
+ struct ATS_Peer *peer_head;
+ struct ATS_Peer *peer_tail;
+
/* current problem matrix */
/* row index array */
int *ia;
Modified: gnunet/src/ats/test_ats_mlp.c
===================================================================
--- gnunet/src/ats/test_ats_mlp.c 2012-01-18 14:39:14 UTC (rev 19242)
+++ gnunet/src/ats/test_ats_mlp.c 2012-01-18 14:42:15 UTC (rev 19243)
@@ -60,15 +60,27 @@
addresses = GNUNET_CONTAINER_multihashmap_create (10);
GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK,
&addr.peer.hashPubKey);
+ addr.mlp_information = NULL;
+ addr.next = NULL;
+ addr.prev = NULL;
addr.plugin = strdup ("dummy");
GNUNET_CONTAINER_multihashmap_put(addresses, &addr.peer.hashPubKey, &addr,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
- GAS_mlp_address_update(mlp, addresses, &addr);
+ /* Add a new address */
+ GAS_mlp_address_update (mlp, addresses, &addr);
GNUNET_assert (mlp != NULL);
+ GNUNET_assert (mlp->addr_in_problem == 1);
+ /* Update an new address */
+ GAS_mlp_address_update (mlp, addresses, &addr);
+ GNUNET_assert (mlp->addr_in_problem == 1);
+
+ /* Delete an address */
+ GAS_mlp_address_delete (mlp, addresses, &addr);
+
GAS_mlp_done (mlp);
GNUNET_free (addr.plugin);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r19243 - gnunet/src/ats,
gnunet <=