gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r27733 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r27733 - gnunet/src/ats
Date: Wed, 3 Jul 2013 15:40:32 +0200

Author: wachs
Date: 2013-07-03 15:40:31 +0200 (Wed, 03 Jul 2013)
New Revision: 27733

Modified:
   gnunet/src/ats/gnunet-service-ats-solver_mlp.c
   gnunet/src/ats/gnunet-service-ats-solver_mlp.h
   gnunet/src/ats/gnunet-service-ats-solver_proportional.c
   gnunet/src/ats/gnunet-service-ats-solver_proportional.h
   gnunet/src/ats/gnunet-service-ats_addresses.c
   gnunet/src/ats/gnunet-service-ats_addresses.h
   gnunet/src/ats/gnunet-service-ats_normalization.c
   gnunet/src/ats/perf_ats_mlp.c
   gnunet/src/ats/test_ats_api.conf
   gnunet/src/ats/test_ats_mlp.c
   gnunet/src/ats/test_ats_mlp_update.c
Log:
changing solver api: remove address hashmap from functions and pass instead 
with init


Modified: gnunet/src/ats/gnunet-service-ats-solver_mlp.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_mlp.c      2013-07-03 11:55:28 UTC 
(rev 27732)
+++ gnunet/src/ats/gnunet-service-ats-solver_mlp.c      2013-07-03 13:40:31 UTC 
(rev 27733)
@@ -401,7 +401,7 @@
 
 static int mlp_create_problem_count_addresses (
                struct GNUNET_CONTAINER_MultiHashMap * peers,
-               struct GNUNET_CONTAINER_MultiHashMap * addresses)
+               const struct GNUNET_CONTAINER_MultiHashMap * addresses)
 {
        struct CountContext cctx;
        cctx.peers = peers;
@@ -716,7 +716,7 @@
  * @return GNUNET_OK or GNUNET_SYSERR
  */
 static int
-mlp_create_problem (struct GAS_MLP_Handle *mlp, struct 
GNUNET_CONTAINER_MultiHashMap * addresses)
+mlp_create_problem (struct GAS_MLP_Handle *mlp)
 {
   struct MLP_Problem *p = &mlp->p;
        int res = GNUNET_OK;
@@ -731,7 +731,7 @@
   p->prob = glp_create_prob ();
   GNUNET_assert (NULL != p->prob);
   p->num_peers = GNUNET_CONTAINER_multihashmap_size (mlp->peers);
-  p->num_addresses = mlp_create_problem_count_addresses (mlp->peers, 
addresses);
+  p->num_addresses = mlp_create_problem_count_addresses (mlp->peers, 
mlp->addresses);
 
   /* Create problem matrix: 10 * #addresses + #q * #addresses + #q, + #peer + 
2 + 1 */
   p->num_elements = (10 * p->num_addresses + mlp->pv.m_q * p->num_addresses +  
mlp->pv.m_q + p->num_peers + 2 + 1);
@@ -766,7 +766,7 @@
   mlp_create_problem_add_invariant_rows (mlp, p);
 
   /* Adding address dependent columns constraint rows */
-  GNUNET_CONTAINER_multihashmap_iterate (addresses, 
&mlp_create_problem_add_address_information, mlp);
+  GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, 
&mlp_create_problem_add_address_information, mlp);
 
   /* Load the matrix */
        LOG (GNUNET_ERROR_TYPE_DEBUG, "Loading matrix\n");
@@ -935,11 +935,10 @@
  * Solves the MLP problem
  *
  * @param solver the MLP Handle
- * @param addresses the address hashmap
  * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure
  */
 int
-GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * 
addresses)
+GAS_mlp_solve_problem (void *solver)
 {
        struct GAS_MLP_Handle *mlp = solver;
        char *filename;
@@ -964,13 +963,12 @@
                LOG (GNUNET_ERROR_TYPE_DEBUG, "No changes to problem\n");
                return GNUNET_OK;
        }
-       mlp->addresses = addresses;
        if (GNUNET_YES == mlp->mlp_prob_changed)
        {
                        LOG (GNUNET_ERROR_TYPE_DEBUG, "Problem size changed, 
rebuilding\n");
                        mlp_delete_problem (mlp);
                        start_build = GNUNET_TIME_absolute_get();
-                       if (GNUNET_SYSERR == mlp_create_problem (mlp, 
addresses))
+                       if (GNUNET_SYSERR == mlp_create_problem (mlp))
                                return GNUNET_SYSERR;
                        duration_build = GNUNET_TIME_absolute_get_duration 
(start_build);
                        mlp->control_param_lp.presolve = GLP_YES;
@@ -1015,7 +1013,7 @@
 
        /* Propagate result*/
        if ((GNUNET_OK == res_lp) && (GNUNET_OK == res_mip))
-               GNUNET_CONTAINER_multihashmap_iterate (addresses, 
&mlp_propagate_results, mlp);
+               GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, 
&mlp_propagate_results, mlp);
 
        struct GNUNET_TIME_Absolute time = GNUNET_TIME_absolute_get();
        if (GNUNET_YES == mlp->write_mip_mps)
@@ -1053,7 +1051,6 @@
  */
 void
 GAS_mlp_address_add (void *solver,
-                                                                               
struct GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                                
struct ATS_Address *address,
                                                                                
uint32_t network)
 {
@@ -1064,10 +1061,8 @@
   int c2;
 
   GNUNET_assert (NULL != solver);
-  GNUNET_assert (NULL != addresses);
   GNUNET_assert (NULL != address);
 
-       mlp->addresses = addresses;
   if (NULL == address->solver_information)
   {
                address->solver_information = GNUNET_malloc (sizeof (struct 
MLP_information));
@@ -1093,13 +1088,13 @@
        /* Problem size changed: new address for peer with pending request */
        mlp->mlp_prob_changed = GNUNET_YES;
        if (GNUNET_YES == mlp->mlp_auto_solve)
-               GAS_mlp_solve_problem (solver, addresses);
+               GAS_mlp_solve_problem (solver);
 }
 
 
 static void
 mlp_update_quality (struct GAS_MLP_Handle *mlp,
-               struct GNUNET_CONTAINER_MultiHashMap *addresses,
+               const struct GNUNET_CONTAINER_MultiHashMap *addresses,
                struct ATS_Address * address,
                const struct GNUNET_ATS_Information *ats_prev, uint32_t 
ats_prev_count)
 {
@@ -1272,7 +1267,7 @@
   if ((GNUNET_YES == mlp->mlp_prob_changed) &&
          (GNUNET_YES == mlp->mlp_auto_solve))
   {
-               GAS_mlp_solve_problem (mlp, addresses);
+               GAS_mlp_solve_problem (mlp);
                return;
   }
 
@@ -1328,7 +1323,6 @@
  */
 void
 GAS_mlp_address_update (void *solver,
-                        struct GNUNET_CONTAINER_MultiHashMap *addresses,
                         struct ATS_Address *address,
                         uint32_t prev_session,
                         int prev_in_use,
@@ -1340,17 +1334,15 @@
        struct MLP_information *mlpi = address->solver_information;
 
        GNUNET_assert (NULL != solver);
-       GNUNET_assert (NULL != addresses);
        GNUNET_assert (NULL != address);
        GNUNET_assert ((NULL != prev_atsi) || (0 == prev_atsi_count));
 
-       mlp->addresses = addresses;
   if (NULL == mlpi)
   {
       LOG (GNUNET_ERROR_TYPE_ERROR, _("Updating address for peer `%s' not 
added before\n"), GNUNET_i2s(&address->peer));
       return;
   }
-       mlp_update_quality (mlp, addresses, address, prev_atsi, 
prev_atsi_count);
+       mlp_update_quality (mlp, mlp->addresses, address, prev_atsi, 
prev_atsi_count);
 
   /* Is this peer included in the problem? */
   if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, 
&address->peer.hashPubKey)))
@@ -1364,7 +1356,7 @@
        mlp->mlp_prob_updated = GNUNET_YES;
 
        if (GNUNET_YES == mlp->mlp_auto_solve)
-               GAS_mlp_solve_problem (solver, addresses);
+               GAS_mlp_solve_problem (solver);
   return;
 }
 
@@ -1381,7 +1373,6 @@
  */
 void
 GAS_mlp_address_delete (void *solver,
-    struct GNUNET_CONTAINER_MultiHashMap * addresses,
     struct ATS_Address *address,
     int session_only)
 {
@@ -1389,12 +1380,10 @@
        struct GAS_MLP_Handle *mlp = solver;
        struct MLP_information *mlpi;
 
-       GNUNET_assert (NULL != solver);
-       GNUNET_assert (NULL != addresses);
+       GNUNET_assert (NULL != solver);;
        GNUNET_assert (NULL != address);
 
        mlpi = address->solver_information;
-       mlp->addresses = addresses;
        if (NULL != mlpi)
        {
                        GNUNET_free (mlpi);
@@ -1412,7 +1401,7 @@
        /* Problem size changed: new address for peer with pending request */
        mlp->mlp_prob_changed = GNUNET_YES;
        if (GNUNET_YES == mlp->mlp_auto_solve)
-               GAS_mlp_solve_problem (solver, addresses);
+               GAS_mlp_solve_problem (solver);
   return;
 }
 
@@ -1475,7 +1464,6 @@
  */
 const struct ATS_Address *
 GAS_mlp_get_preferred_address (void *solver,
-                               struct GNUNET_CONTAINER_MultiHashMap * 
addresses,
                                const struct GNUNET_PeerIdentity *peer)
 {
   struct GAS_MLP_Handle *mlp = solver;
@@ -1483,12 +1471,11 @@
   struct ATS_Address *res = NULL;
 
   GNUNET_assert (NULL != solver);
-  GNUNET_assert (NULL != addresses);
   GNUNET_assert (NULL != peer);
 
   LOG (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n",
                GNUNET_i2s (peer));
-       mlp->addresses = addresses;
+
   /* Is this peer included in the problem? */
   if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, 
&peer->hashPubKey)))
   {
@@ -1504,10 +1491,10 @@
          mlp->mlp_prob_changed = GNUNET_YES;
   }
   if (GNUNET_YES == mlp->mlp_auto_solve)
-       GAS_mlp_solve_problem (mlp, addresses);
+       GAS_mlp_solve_problem (mlp);
 
   /* Get prefered address */
-  GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey,
+  GNUNET_CONTAINER_multihashmap_get_multiple (mlp->addresses, 
&peer->hashPubKey,
                                                                                
                                                                                
                mlp_get_preferred_address_it, res);
 
   return res;
@@ -1547,7 +1534,7 @@
 
   if (0 < s->bulk_request)
   {
-       GAS_mlp_solve_problem (solver, s->addresses);
+       GAS_mlp_solve_problem (solver);
        s->bulk_request= 0;
   }
 }
@@ -1563,14 +1550,12 @@
  */
 void
 GAS_mlp_stop_get_preferred_address (void *solver,
-                                     struct GNUNET_CONTAINER_MultiHashMap 
*addresses,
                                      const struct GNUNET_PeerIdentity *peer)
 {
   struct GAS_MLP_Handle *mlp = solver;
   struct ATS_Peer *p = NULL;
 
   GNUNET_assert (NULL != solver);
-  GNUNET_assert (NULL != addresses);
   GNUNET_assert (NULL != peer);
 
   if (NULL != (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, 
&peer->hashPubKey)))
@@ -1592,7 +1577,6 @@
  */
 void
 GAS_mlp_address_change_preference (void *solver,
-                                                                  struct 
GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                   const struct 
GNUNET_PeerIdentity *peer,
                                                                   enum 
GNUNET_ATS_PreferenceKind kind,
                                                                   double 
pref_rel)
@@ -1604,7 +1588,6 @@
                GNUNET_i2s(peer));
 
   GNUNET_STATISTICS_update (mlp->stats,"# LP address preference changes", 1, 
GNUNET_NO);
-       mlp->addresses = addresses;
   /* Update the constraints with changed preferences */
 
   /* Update quality constraint c7 */
@@ -1621,7 +1604,7 @@
        /* Problem size changed: new address for peer with pending request */
        mlp->mlp_prob_updated = GNUNET_YES;
        if (GNUNET_YES == mlp->mlp_auto_solve)
-               GAS_mlp_solve_problem (solver, addresses);
+               GAS_mlp_solve_problem (solver);
   return;
 }
 
@@ -1683,6 +1666,7 @@
 void *
 GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
               const struct GNUNET_STATISTICS_Handle *stats,
+              const struct GNUNET_CONTAINER_MultiHashMap *addresses,
               int *network,
               unsigned long long *out_dest,
               unsigned long long *in_dest,
@@ -1690,7 +1674,9 @@
               GAS_bandwidth_changed_cb bw_changed_cb,
               void *bw_changed_cb_cls,
               GAS_get_preferences get_preference,
-              void *get_preference_cls)
+              void *get_preference_cls,
+              GAS_get_properties get_properties,
+              void *get_properties_cls)
 {
   struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle));
 
@@ -1707,6 +1693,13 @@
   struct GNUNET_TIME_Relative max_duration;
   long long unsigned int max_iterations;
 
+  GNUNET_assert (NULL != cfg);
+  GNUNET_assert (NULL != stats);
+  GNUNET_assert (NULL != addresses);
+  GNUNET_assert (NULL != bw_changed_cb);
+  GNUNET_assert (NULL != get_preference);
+  GNUNET_assert (NULL != get_properties);
+
   /* Init GLPK environment */
   int res = glp_init_env();
   switch (res) {
@@ -1892,10 +1885,13 @@
 
   /* Assign options to handle */
   mlp->stats = (struct GNUNET_STATISTICS_Handle *) stats;
+  mlp->addresses = addresses;
   mlp->bw_changed_cb = bw_changed_cb;
   mlp->bw_changed_cb_cls = bw_changed_cb_cls;
   mlp->get_preferences = get_preference;
   mlp->get_preferences_cls = get_preference_cls;
+  mlp->get_properties = get_properties;
+  mlp->get_properties_cls = get_properties_cls;
   /* Setting MLP Input variables */
   mlp->pv.co_D = D;
   mlp->pv.co_R = R;

Modified: gnunet/src/ats/gnunet-service-ats-solver_mlp.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_mlp.h      2013-07-03 11:55:28 UTC 
(rev 27732)
+++ gnunet/src/ats/gnunet-service-ats-solver_mlp.h      2013-07-03 13:40:31 UTC 
(rev 27733)
@@ -90,12 +90,6 @@
 
   /* Legacy preference value */
   double f;
-
-#if 0
-  /* Array of quality preferences */
-  double f_q[GNUNET_ATS_QualityPropertiesCount];
-
-#endif
 };
 
 
@@ -223,7 +217,7 @@
   /**
    * Address hashmap for lookups
    */
-  struct GNUNET_CONTAINER_MultiHashMap *addresses;
+  const struct GNUNET_CONTAINER_MultiHashMap *addresses;
 
   /**
    * Addresses' bandwidth changed callback
@@ -235,10 +229,28 @@
    */
   void *bw_changed_cb_cls;
 
+
+
+  /**
+   * ATS function to get preferences
+   */
   GAS_get_preferences get_preferences;
 
+  /**
+   * Closure for ATS function to get preferences
+   */
   void *get_preferences_cls;
 
+  /**
+   * ATS function to get properties
+   */
+  GAS_get_properties get_properties;
+
+  /**
+   * Closure for ATS function to get properties
+   */
+  void *get_properties_cls;
+
   struct MLP_Problem p;
 
   struct MLP_Variables pv;
@@ -353,11 +365,10 @@
  * Solves the MLP problem
  *
  * @param solver the MLP Handle
- * @param addresses the address hashmap
  * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure
  */
 int
-GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * 
addresses);
+GAS_mlp_solve_problem (void *solver);
 
 
 /**
@@ -378,6 +389,7 @@
 void *
 GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
               const struct GNUNET_STATISTICS_Handle *stats,
+              const struct GNUNET_CONTAINER_MultiHashMap *addresses,
               int *network,
               unsigned long long *out_dest,
               unsigned long long *in_dest,
@@ -385,7 +397,9 @@
               GAS_bandwidth_changed_cb bw_changed_cb,
               void *bw_changed_cb_cls,
               GAS_get_preferences get_preference,
-              void *get_preference_cls);
+              void *get_preference_cls,
+              GAS_get_properties get_properties,
+              void *get_properties_cls);
 
 
 /**
@@ -398,7 +412,6 @@
  */
 void
 GAS_mlp_address_add (void *solver,
-                                                                               
struct GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                                
struct ATS_Address *address,
                                                                                
uint32_t network);
 
@@ -424,7 +437,6 @@
  */
 void
 GAS_mlp_address_update (void *solver,
-                        struct GNUNET_CONTAINER_MultiHashMap *addresses,
                         struct ATS_Address *address,
                         uint32_t prev_session,
                         int prev_in_use,
@@ -445,7 +457,6 @@
  */
 void
 GAS_mlp_address_delete (void *solver,
-                        struct GNUNET_CONTAINER_MultiHashMap *addresses,
                         struct ATS_Address *address,
                         int session_only);
 
@@ -461,7 +472,6 @@
  */
 void
 GAS_mlp_address_change_preference (void *solver,
-                                                                  struct 
GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                   const struct 
GNUNET_PeerIdentity *peer,
                                                                   enum 
GNUNET_ATS_PreferenceKind kind,
                                                                   double 
pref_rel);
@@ -493,7 +503,6 @@
  */
 const struct ATS_Address *
 GAS_mlp_get_preferred_address (void *solver,
-                               struct GNUNET_CONTAINER_MultiHashMap * 
addresses,
                                const struct GNUNET_PeerIdentity *peer);
 
 
@@ -507,7 +516,6 @@
 
 void
 GAS_mlp_stop_get_preferred_address (void *solver,
-                                     struct GNUNET_CONTAINER_MultiHashMap 
*addresses,
                                      const struct GNUNET_PeerIdentity *peer);
 
 

Modified: gnunet/src/ats/gnunet-service-ats-solver_proportional.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_proportional.c     2013-07-03 
11:55:28 UTC (rev 27732)
+++ gnunet/src/ats/gnunet-service-ats-solver_proportional.c     2013-07-03 
13:40:31 UTC (rev 27733)
@@ -224,6 +224,11 @@
   struct GNUNET_STATISTICS_Handle *stats;
 
   /**
+   * Hashmap containing all valid addresses
+   */
+  const struct GNUNET_CONTAINER_MultiHashMap *addresses;
+
+  /**
    * Bandwidth changed callback
    */
   GAS_bandwidth_changed_cb bw_changed;
@@ -244,6 +249,16 @@
   void *get_preferences_cls;
 
   /**
+   * ATS function to get properties
+   */
+  GAS_get_properties get_properties;
+
+  /**
+   * Closure for ATS function to get properties
+   */
+  void *get_properties_cls;
+
+  /**
    * Bulk lock
    */
   int bulk_lock;
@@ -551,6 +566,15 @@
 static int
 get_performance_info (struct ATS_Address *address, uint32_t type);
 
+
+
+struct FindBestAddressCtx
+{
+       struct GAS_PROPORTIONAL_Handle *s;
+       struct ATS_Address *best;
+};
+
+
 /**
  * Find a "good" address to use for a peer by iterating over the addresses for 
this peer.
  * If we already have an existing address, we stick to it.
@@ -564,15 +588,12 @@
 static int
 find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void 
*value)
 {
-  struct ATS_Address **previous_p = cls;
+       struct FindBestAddressCtx *fba_ctx = (struct FindBestAddressCtx *) cls;
   struct ATS_Address *current = (struct ATS_Address *) value;
-  struct ATS_Address *previous = *previous_p;
   struct GNUNET_TIME_Absolute now;
   struct Network *net = (struct Network *) current->solver_information;
-  uint32_t p_distance_cur;
-  uint32_t p_distance_prev;
-  uint32_t p_delay_cur;
-  uint32_t p_delay_prev;
+  const double *norm_prop_cur;
+  const double *norm_prop_prev;
 
   now = GNUNET_TIME_absolute_get();
 
@@ -585,61 +606,57 @@
                 GNUNET_TIME_absolute_get_difference(now, 
current->blocked_until).rel_value);
     return GNUNET_OK;
   }
-
   if (GNUNET_NO == is_bandwidth_available_in_network (net))
     return GNUNET_OK; /* There's no bandwidth available in this network */
-
-  if (NULL != previous)
+  if (NULL != fba_ctx->best)
   {
-       GNUNET_assert (NULL != previous->plugin);
+       GNUNET_assert (NULL != fba_ctx->best->plugin);
        GNUNET_assert (NULL != current->plugin);
-    if (0 == strcmp (previous->plugin, current->plugin))
+    if (0 == strcmp (fba_ctx->best->plugin, current->plugin))
     {
-      if ((0 != previous->addr_len) &&
+      if ((0 != fba_ctx->best->addr_len) &&
           (0 == current->addr_len))
       {
         /* saved address was an outbound address, but we have an inbound 
address */
-        *previous_p = current;
+       fba_ctx->best = current;
         return GNUNET_OK;
       }
-      if (0 == previous->addr_len)
+      if (0 == fba_ctx->best->addr_len)
       {
         /* saved address was an inbound address, so do not overwrite */
         return GNUNET_OK;
       }
     }
   }
-
-  if (NULL == previous)
+  if (NULL == fba_ctx->best)
   {
-    *previous_p = current;
+       fba_ctx->best = current;
     return GNUNET_OK;
   }
-  if ((ntohl (previous->assigned_bw_in.value__) == 0) &&
+  if ((ntohl (fba_ctx->best->assigned_bw_in.value__) == 0) &&
       (ntohl (current->assigned_bw_in.value__) > 0))
   {
     /* stick to existing connection */
-    *previous_p = current;
+       fba_ctx->best = current;
     return GNUNET_OK;
   }
 
-  p_distance_prev = get_performance_info (previous, 
GNUNET_ATS_QUALITY_NET_DISTANCE);
-  p_distance_cur = get_performance_info (current, 
GNUNET_ATS_QUALITY_NET_DISTANCE);
-  if ((p_distance_prev != GNUNET_ATS_VALUE_UNDEFINED) && (p_distance_cur != 
GNUNET_ATS_VALUE_UNDEFINED) &&
-               (p_distance_prev > p_distance_cur))
+  norm_prop_cur = fba_ctx->s->get_properties (fba_ctx->s->get_properties_cls,
+               (const struct ATS_Address *) current);
+  GNUNET_break (0);
+  norm_prop_prev = fba_ctx->s->get_properties (fba_ctx->s->get_properties_cls,
+               (const struct ATS_Address *) fba_ctx->best);
+
+  if (norm_prop_cur[1] < norm_prop_prev[1])
   {
     /* user shorter distance */
-    *previous_p = current;
+    fba_ctx->best = current;
     return GNUNET_OK;
   }
-
-  p_delay_prev = get_performance_info (previous, GNUNET_ATS_QUALITY_NET_DELAY);
-  p_delay_cur = get_performance_info (current, GNUNET_ATS_QUALITY_NET_DELAY);
-  if ((p_delay_prev != GNUNET_ATS_VALUE_UNDEFINED) && (p_delay_cur != 
GNUNET_ATS_VALUE_UNDEFINED) &&
-               (p_delay_prev > p_delay_cur))
+  if (norm_prop_cur[0] < norm_prop_prev[0])
   {
-    /* user lower latency */
-    *previous_p = current;
+    /* user shorter distance */
+       fba_ctx->best = current;
     return GNUNET_OK;
   }
 
@@ -857,14 +874,12 @@
  * Changes the preferences for a peer in the problem
  *
  * @param solver the solver handle
- * @param addresses the address hashmap
  * @param peer the peer to change the preference for
  * @param kind the kind to change the preference
  * @param pref_rel the normalized preference value for this kind over all 
clients
  */
 void
 GAS_proportional_address_change_preference (void *solver,
-                                                                               
        struct GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                                
        const struct GNUNET_PeerIdentity *peer,
                                                                                
        enum GNUNET_ATS_PreferenceKind kind,
                                                                                
        double pref_rel)
@@ -876,6 +891,7 @@
        distribute_bandwidth_in_all_networks (s);
 }
 
+
 /**
  * Get the preferred address for a specific peer
  *
@@ -885,41 +901,44 @@
  */
 const struct ATS_Address *
 GAS_proportional_get_preferred_address (void *solver,
-                               struct GNUNET_CONTAINER_MultiHashMap * 
addresses,
                                const struct GNUNET_PeerIdentity *peer)
 {
   struct GAS_PROPORTIONAL_Handle *s = solver;
   struct Network *net_prev;
   struct Network *net_cur;
-  struct ATS_Address *cur;
   struct ATS_Address *prev;
+  struct FindBestAddressCtx fba_ctx;
 
   GNUNET_assert (s != NULL);
-  cur = NULL;
+  GNUNET_assert (peer != NULL);
+
   /* Get address with: stick to current address, lower distance, lower latency 
*/
-  GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey,
-                                              &find_best_address_it, &cur);
-  if (NULL == cur)
+  fba_ctx.s = s;
+  fba_ctx.best = NULL;
+  GNUNET_break (0);
+  GNUNET_CONTAINER_multihashmap_get_multiple (s->addresses, &peer->hashPubKey,
+                                              &find_best_address_it, &fba_ctx);
+  if (NULL == fba_ctx.best)
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG, "Cannot suggest address for peer `%s'\n", 
GNUNET_i2s (peer));
     return NULL;
   }
 
   LOG (GNUNET_ERROR_TYPE_DEBUG, "Suggesting %s address %p for peer `%s'\n",
-      (GNUNET_NO == cur->active) ? "inactive" : "active",
-      cur, GNUNET_i2s (peer));
-  net_cur = (struct Network *) cur->solver_information;
-  if (NULL == cur)
+      (GNUNET_NO == fba_ctx.best->active) ? "inactive" : "active",
+               fba_ctx.best, GNUNET_i2s (peer));
+  net_cur = (struct Network *) fba_ctx.best->solver_information;
+  if (NULL == fba_ctx.best)
   {
     LOG (GNUNET_ERROR_TYPE_ERROR, "Trying to suggesting unknown address peer 
`%s'\n",
         GNUNET_i2s (peer));
     GNUNET_break (0);
     return NULL;
   }
-  if (GNUNET_YES == cur->active)
+  if (GNUNET_YES == fba_ctx.best->active)
   {
       /* This address was selected previously, so no need to update quotas */
-      return cur;
+      return fba_ctx.best;
   }
 
   /* This address was not active, so we have to:
@@ -929,7 +948,7 @@
    * - update quota for this address network
    */
 
-  prev = get_active_address (s, addresses, peer);
+  prev = get_active_address (s, (struct GNUNET_CONTAINER_MultiHashMap *) 
s->addresses, peer);
   if (NULL != prev)
   {
       net_prev = (struct Network *) prev->solver_information;
@@ -942,16 +961,16 @@
        distribute_bandwidth_in_network (s, net_prev, NULL);
   }
 
-  if (GNUNET_NO == (is_bandwidth_available_in_network 
(cur->solver_information)))
+  if (GNUNET_NO == (is_bandwidth_available_in_network 
(fba_ctx.best->solver_information)))
   {
     GNUNET_break (0); /* This should never happen*/
     return NULL;
   }
 
-  cur->active = GNUNET_YES;
+  fba_ctx.best->active = GNUNET_YES;
   addresse_increment(s, net_cur, GNUNET_NO, GNUNET_YES);
-  distribute_bandwidth_in_network (s, net_cur, cur);
-  return cur;
+  distribute_bandwidth_in_network (s, net_cur, fba_ctx.best);
+  return fba_ctx.best;
 }
 
 
@@ -964,7 +983,6 @@
  */
 void
 GAS_proportional_stop_get_preferred_address (void *solver,
-                                     struct GNUNET_CONTAINER_MultiHashMap 
*addresses,
                                      const struct GNUNET_PeerIdentity *peer)
 {
        return;
@@ -981,8 +999,8 @@
  */
 void
 GAS_proportional_address_delete (void *solver,
-    struct GNUNET_CONTAINER_MultiHashMap * addresses,
-    struct ATS_Address *address, int session_only)
+                                                                               
                                 struct ATS_Address *address,
+                                                                               
                                 int session_only)
 {
   struct GAS_PROPORTIONAL_Handle *s = solver;
   struct Network *net;
@@ -1090,15 +1108,13 @@
  * Add a new single address to a network
  *
  * @param solver the solver Handle
- * @param addresses the address hashmap containing all addresses
  * @param address the address to add
  * @param network network type of this address
  */
 void
 GAS_proportional_address_add (void *solver,
-                                                       struct 
GNUNET_CONTAINER_MultiHashMap *addresses,
-                                                       struct ATS_Address 
*address,
-                                                       uint32_t network);
+                                                                               
                                        struct ATS_Address *address,
+                                                                               
                                        uint32_t network);
 
 /**
  * Updates a single address in the solver and checks previous values
@@ -1113,7 +1129,6 @@
  */
 void
 GAS_proportional_address_update (void *solver,
-                              struct GNUNET_CONTAINER_MultiHashMap *addresses,
                               struct ATS_Address *address,
                               uint32_t session,
                               int in_use,
@@ -1163,7 +1178,7 @@
 
         save_active = address->active;
         /* remove from old network */
-        GAS_proportional_address_delete (solver, addresses, address, 
GNUNET_NO);
+        GAS_proportional_address_delete (solver, address, GNUNET_NO);
 
         /* set new network type */
         new_net = get_network (solver, addr_net);
@@ -1180,7 +1195,7 @@
         address->solver_information = new_net;
 
         /* Add to new network and update*/
-        GAS_proportional_address_add (solver, addresses, address, addr_net);
+        GAS_proportional_address_add (solver, address, addr_net);
         if (GNUNET_YES == save_active)
         {
           /* check if bandwidth available in new network */
@@ -1201,7 +1216,7 @@
             s->bw_changed  (s->bw_changed_cls, address);
 
             /* Find new address to suggest since no bandwidth in network*/
-            new = (struct ATS_Address *) 
GAS_proportional_get_preferred_address (s, addresses, &address->peer);
+            new = (struct ATS_Address *) 
GAS_proportional_get_preferred_address (s, &address->peer);
             if (NULL != new)
             {
                 /* Have an alternative address to suggest */
@@ -1248,9 +1263,8 @@
  */
 void
 GAS_proportional_address_add (void *solver,
-                                                       struct 
GNUNET_CONTAINER_MultiHashMap *addresses,
-                                                       struct ATS_Address 
*address,
-                                                       uint32_t network)
+                                                                               
                                        struct ATS_Address *address,
+                                                                               
                                        uint32_t network)
 {
   struct GAS_PROPORTIONAL_Handle *s = solver;
   struct Network *net = NULL;
@@ -1293,6 +1307,7 @@
  *
  * @param cfg configuration handle
  * @param stats the GNUNET_STATISTICS handle
+ * @param addresses hashmap containing all addresses
  * @param network array of GNUNET_ATS_NetworkType with length dest_length
  * @param out_quota array of outbound quotas
  * @param in_quota array of outbound quota
@@ -1306,6 +1321,7 @@
 void *
 GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
                        const struct GNUNET_STATISTICS_Handle *stats,
+                       const struct GNUNET_CONTAINER_MultiHashMap *addresses,
                        int *network,
                        unsigned long long *out_quota,
                        unsigned long long *in_quota,
@@ -1313,24 +1329,35 @@
                        GAS_bandwidth_changed_cb bw_changed_cb,
                        void *bw_changed_cb_cls,
                        GAS_get_preferences get_preference,
-                       void *get_preference_cls)
+                       void *get_preference_cls,
+                       GAS_get_properties get_properties,
+                       void *get_properties_cls)
 {
   int c;
   struct GAS_PROPORTIONAL_Handle *s = GNUNET_malloc (sizeof (struct 
GAS_PROPORTIONAL_Handle));
   struct Network * cur;
   char * net_str[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkTypeString;
 
+  GNUNET_assert (NULL != cfg);
+  GNUNET_assert (NULL != stats);
+  GNUNET_assert (NULL != network);
+  GNUNET_assert (NULL != bw_changed_cb);
+  GNUNET_assert (NULL != get_preference);
+  GNUNET_assert (NULL != get_properties);
 
   s->stats = (struct GNUNET_STATISTICS_Handle *) stats;
   s->bw_changed = bw_changed_cb;
   s->bw_changed_cls = bw_changed_cb_cls;
   s->get_preferences = get_preference;
   s->get_preferences_cls = get_preference_cls;
+  s->get_properties = get_properties;
+  s->get_properties_cls = get_properties_cls;
   s->networks = dest_length;
   s->network_entries = GNUNET_malloc (dest_length * sizeof (struct Network));
   s->active_addresses = 0;
   s->total_addresses = 0;
   s->bulk_lock = GNUNET_NO;
+  s->addresses = addresses;
 
   for (c = 0; c < dest_length; c++)
   {

Modified: gnunet/src/ats/gnunet-service-ats-solver_proportional.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats-solver_proportional.h     2013-07-03 
11:55:28 UTC (rev 27732)
+++ gnunet/src/ats/gnunet-service-ats-solver_proportional.h     2013-07-03 
13:40:31 UTC (rev 27733)
@@ -45,7 +45,6 @@
  */
 void
 GAS_proportional_address_change_preference (void *solver,
-                                                                               
        struct GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                                
        const struct GNUNET_PeerIdentity *peer,
                                                                                
        enum GNUNET_ATS_PreferenceKind kind,
                                                                                
        double pref_rel);
@@ -68,6 +67,7 @@
  * @param cfg configuration handle
  * @param stats the GNUNET_STATISTICS handle
  * @param network array of GNUNET_ATS_NetworkType with length dest_length
+ * @param addresses hashmap containing all addresses
  * @param out_quota array of outbound quotas
  * @param in_quota array of outbound quota
  * @param dest_length array length for quota arrays
@@ -80,6 +80,7 @@
 void *
 GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
                      const struct GNUNET_STATISTICS_Handle *stats,
+                     const struct GNUNET_CONTAINER_MultiHashMap *addresses,
                      int *network,
                      unsigned long long *out_quota,
                      unsigned long long *in_quota,
@@ -87,9 +88,10 @@
                      GAS_bandwidth_changed_cb bw_changed_cb,
                      void *bw_changed_cb_cls,
                      GAS_get_preferences get_preference,
-                     void *get_preference_cls);
+                     void *get_preference_cls,
+                     GAS_get_properties get_properties,
+                     void *get_properties_cls);
 
-
 /**
  * Shutdown the proportional problem solver
  *
@@ -109,7 +111,6 @@
  */
 void
 GAS_proportional_address_add (void *solver,
-                                                       struct 
GNUNET_CONTAINER_MultiHashMap *addresses,
                                                        struct ATS_Address 
*address,
                                                        uint32_t network);
 
@@ -127,7 +128,6 @@
  */
 void
 GAS_proportional_address_update (void *solver,
-    struct GNUNET_CONTAINER_MultiHashMap *addresses,
     struct ATS_Address *address,
     uint32_t session,
     int in_use,
@@ -145,7 +145,6 @@
  */
 void
 GAS_proportional_address_delete (void *solver,
-    struct GNUNET_CONTAINER_MultiHashMap * addresses,
     struct ATS_Address *address, int session_only);
 
 
@@ -173,7 +172,6 @@
  */
 void
 GAS_proportional_stop_get_preferred_address (void *solver,
-                                     struct GNUNET_CONTAINER_MultiHashMap 
*addresses,
                                      const struct GNUNET_PeerIdentity *peer);
 
 
@@ -186,7 +184,6 @@
  */
 const struct ATS_Address *
 GAS_proportional_get_preferred_address (void *solver,
-                               struct GNUNET_CONTAINER_MultiHashMap * 
addresses,
                                const struct GNUNET_PeerIdentity *peer);
 
 /* end of gnunet-service-ats-solver_proportional.c */

Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c       2013-07-03 11:55:28 UTC 
(rev 27732)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c       2013-07-03 13:40:31 UTC 
(rev 27733)
@@ -822,7 +822,7 @@
     handle->s_bulk_start (handle->solver);
     GAS_normalization_normalize_property (handle->addresses, aa, atsi, 
atsi_count);
     handle->s_bulk_stop (handle->solver);
-    handle->s_add (handle->solver, handle->addresses, aa, addr_net);
+    handle->s_add (handle->solver, aa, addr_net);
     /* Notify performance clients about new address */
     GAS_performance_notify_all_clients (&aa->peer,
         aa->plugin,
@@ -868,7 +868,7 @@
   handle->s_bulk_start (handle->solver);
   GAS_normalization_normalize_property (handle->addresses, ea, atsi, 
atsi_count);
   handle->s_bulk_stop (handle->solver);
-  handle->s_update (handle->solver, handle->addresses, ea, session_id, 
ea->used, atsi_delta, atsi_delta_count);
+  handle->s_update (handle->solver, ea, session_id, ea->used, atsi_delta, 
atsi_delta_count);
   GNUNET_free_non_null (atsi_delta);
 
   /* Do the update */
@@ -957,7 +957,7 @@
   handle->s_bulk_stop (handle->solver);
 
   /* Tell solver about update */
-  handle->s_update (handle->solver, handle->addresses, aa, prev_session, 
aa->used, atsi_delta, atsi_delta_count);
+  handle->s_update (handle->solver, aa, prev_session, aa->used, atsi_delta, 
atsi_delta_count);
   GNUNET_free_non_null (atsi_delta);
 }
 
@@ -1013,7 +1013,7 @@
                   GNUNET_i2s (&aa->peer), aa->session_id, aa);
 
       /* Notify solver about deletion */
-      handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO);
+      handle->s_del (handle->solver, aa, GNUNET_NO);
       destroy_address (handle, aa);
       dc->result = GNUNET_NO;
       return GNUNET_OK; /* Continue iteration */
@@ -1043,7 +1043,7 @@
                     GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id);
 
         /* Notify solver about deletion */
-        handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO);
+        handle->s_del (handle->solver, aa, GNUNET_NO);
         destroy_address (handle, aa);
         dc->result = GNUNET_NO;
         return GNUNET_OK; /* Continue iteration */
@@ -1055,7 +1055,7 @@
                     "Deleting session for peer `%s': `%s' %u\n",
                     GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id);
         /* Notify solver to delete session */
-        handle->s_del (handle->solver, handle->addresses, aa, GNUNET_YES);
+        handle->s_del (handle->solver, aa, GNUNET_YES);
         aa->session_id = 0;
         return GNUNET_OK;
     }
@@ -1180,7 +1180,7 @@
   /* Tell solver about update */
   prev_inuse = ea->used;
   ea->used = in_use;
-  handle->s_update (handle->solver, handle->addresses, ea, session_id, 
prev_inuse, NULL, 0);
+  handle->s_update (handle->solver, ea, session_id, prev_inuse, NULL, 0);
 
 
   return GNUNET_OK;
@@ -1215,7 +1215,7 @@
                   "No address requests pending for peer `%s', cannot 
remove!\n", GNUNET_i2s (peer));
       return;
   }
-  handle->s_get_stop (handle->solver, handle->addresses, peer);
+  handle->s_get_stop (handle->solver, peer);
   GAS_addresses_handle_backoff_reset (handle, peer);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Removed request pending for peer `%s\n", GNUNET_i2s (peer));
@@ -1258,7 +1258,7 @@
   }
 
   /* Get prefered address from solver */
-  aa = (struct ATS_Address *) handle->s_get (handle->solver, 
handle->addresses, peer);
+  aa = (struct ATS_Address *) handle->s_get (handle->solver, peer);
   if (NULL == aa)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1351,7 +1351,7 @@
        GNUNET_assert (NULL != cls);
        struct GAS_Addresses_Handle *handle = cls;
   /* Tell solver about update */
-  handle->s_pref (handle->solver, handle->addresses, peer, kind, pref_rel);
+  handle->s_pref (handle->solver, peer, kind, pref_rel);
 }
 
 
@@ -1403,9 +1403,9 @@
  * @return array of double values with |GNUNET_ATS_QualityPropertiesCount| 
elements
  */
 const double *
-get_property_cb (void *cls, struct ATS_Address *address)
+get_property_cb (void *cls, const struct ATS_Address *address)
 {
-       return GAS_normalization_get_properties (address);
+       return GAS_normalization_get_properties ((struct ATS_Address *) 
address);
 }
 
 /**
@@ -1681,6 +1681,7 @@
       ah->s_bulk_stop = &GAS_mlp_bulk_stop;
       ah->s_done = &GAS_mlp_done;
 #else
+
       GNUNET_free (ah);
       return NULL;
 #endif
@@ -1720,10 +1721,11 @@
                                                                                
                 &normalized_property_changed_cb, ah);
   quota_count = load_quotas(cfg, quotas_in, quotas_out, 
GNUNET_ATS_NetworkTypeCount);
 
-  ah->solver = ah->s_init (cfg, stats,
+  ah->solver = ah->s_init (cfg, stats, ah->addresses,
                  quotas, quotas_in, quotas_out, quota_count,
                  &bandwidth_changed_cb, ah,
-                 &get_preferences_cb, NULL);
+                 &get_preferences_cb, NULL,
+                 &get_property_cb, NULL);
   if (NULL == ah->solver)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n");
@@ -1750,7 +1752,7 @@
 {
   struct GAS_Addresses_Handle *handle = cls;
   struct ATS_Address *aa = value;
-  handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO);
+  handle->s_del (handle->solver, aa, GNUNET_NO);
   destroy_address (handle, aa);
   return GNUNET_OK;
 }

Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h       2013-07-03 11:55:28 UTC 
(rev 27732)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h       2013-07-03 13:40:31 UTC 
(rev 27733)
@@ -365,6 +365,11 @@
  (*GAS_get_preferences) (void *cls, const struct GNUNET_PeerIdentity *id);
 
 
+typedef const double *
+ (*GAS_get_properties) (void *cls, const struct ATS_Address *address);
+
+
+
 /*
  * Solver API
  * ----------
@@ -372,6 +377,7 @@
 
 /**
  * Init the simplistic problem solving component
+ *==32673==    by 0x40571F: GAS_addresses_request_address 
(gnunet-service-ats_addresses.c:1261)
  *
  * Quotas:
  * network[i] contains the network type as type GNUNET_ATS_NetworkType[i]
@@ -386,6 +392,7 @@
  *
  * @param cfg configuration handle
  * @param stats the GNUNET_STATISTICS handle
+ * @param addresses hashmap containing all addresses
  * @param network array of GNUNET_ATS_NetworkType with length dest_length
  * @param out_quota array of outbound quotas
  * @param in_quota array of outbound quota
@@ -395,6 +402,7 @@
 typedef void *
  (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg,
                      const struct GNUNET_STATISTICS_Handle *stats,
+                     const struct GNUNET_CONTAINER_MultiHashMap *addresses,
                      int *network,
                      unsigned long long *out_quota,
                      unsigned long long *in_quota,
@@ -402,7 +410,9 @@
                      GAS_bandwidth_changed_cb bw_changed_cb,
                      void *bw_changed_cb_cls,
                      GAS_get_preferences get_preference,
-                     void *get_preference_cls);
+                     void *get_preference_cls,
+                     GAS_get_properties get_properties,
+                     void *get_properties_cls);
 
 
 /**
@@ -417,7 +427,6 @@
  */
 typedef void
 (*GAS_solver_address_change_preference) (void *solver,
-                                                                               
                                                                                
 struct GNUNET_CONTAINER_MultiHashMap *addresses,
                                                                                
                                                                                
 const struct GNUNET_PeerIdentity *peer,
                                                                                
                                                                                
 enum GNUNET_ATS_PreferenceKind kind,
                                                                                
                                                                                
 double pref_rel);
@@ -438,9 +447,8 @@
  */
 typedef void
 (*GAS_solver_address_add) (void *solver,
-                                                                               
                                struct GNUNET_CONTAINER_MultiHashMap *addresses,
-                                                                               
                                struct ATS_Address *address,
-                                                                               
                                uint32_t network);
+                                                                               
                         struct ATS_Address *address,
+                                                                               
                         uint32_t network);
 
 
 /**
@@ -453,7 +461,6 @@
  */
 typedef void
  (*GAS_solver_address_delete) (void *solver,
-                               struct GNUNET_CONTAINER_MultiHashMap *addresses,
                                struct ATS_Address *address,
                                int session_only);
 
@@ -471,7 +478,6 @@
  */
 typedef void
 (*GAS_solver_address_update) (void *solver,
-                              struct GNUNET_CONTAINER_MultiHashMap *addresses,
                               struct ATS_Address *address,
                               uint32_t prev_session,
                               int in_use,
@@ -488,7 +494,6 @@
  */
 typedef const struct ATS_Address *
 (*GAS_solver_get_preferred_address) (void *solver,
-                                     struct GNUNET_CONTAINER_MultiHashMap 
*addresses,
                                      const struct GNUNET_PeerIdentity *peer);
 
 
@@ -501,7 +506,6 @@
  */
 typedef void
 (*GAS_solver_stop_get_preferred_address) (void *solver,
-                                     struct GNUNET_CONTAINER_MultiHashMap 
*addresses,
                                      const struct GNUNET_PeerIdentity *peer);
 
 /**

Modified: gnunet/src/ats/gnunet-service-ats_normalization.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_normalization.c   2013-07-03 11:55:28 UTC 
(rev 27732)
+++ gnunet/src/ats/gnunet-service-ats_normalization.c   2013-07-03 13:40:31 UTC 
(rev 27733)
@@ -534,6 +534,7 @@
                else
                        norm_values[i] = DEFAULT_REL_QUALITY;
        }
+       GNUNET_break (0);
        return norm_values;
 }
 

Modified: gnunet/src/ats/perf_ats_mlp.c
===================================================================
--- gnunet/src/ats/perf_ats_mlp.c       2013-07-03 11:55:28 UTC (rev 27732)
+++ gnunet/src/ats/perf_ats_mlp.c       2013-07-03 13:40:31 UTC (rev 27733)
@@ -150,7 +150,13 @@
         /* TODO */
 }
 
+const double *
+get_property_cb (void *cls, const struct ATS_Address *address)
+{
+       return GAS_normalization_get_properties ((struct ATS_Address *) 
address);
+}
 
+
 static const double *
 get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id)
 {
@@ -184,7 +190,7 @@
        ats[1].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
        ats[1].value = htonl 
(GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 10));
 
-       GAS_mlp_address_update (mlp, addresses, address, 0, GNUNET_YES, ats, 2);
+       GAS_mlp_address_update (mlp, address, 0, GNUNET_YES, ats, 2);
 }
 
 
@@ -215,7 +221,7 @@
                default:
                        break;
        }
-       GAS_mlp_address_update (mlp, addresses, cur, 0, GNUNET_YES, ats, 1);
+       GAS_mlp_address_update (mlp, cur, 0, GNUNET_YES, ats, 1);
 }
 
 static void
@@ -314,8 +320,11 @@
   addresses = GNUNET_CONTAINER_multihashmap_create (N_address, GNUNET_NO);
 
   /* Init MLP solver */
-  mlp  = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in,
-               GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, 
&get_preferences_cb, NULL);
+  mlp  = GAS_mlp_init (cfg, stats, addresses,
+               quotas, quotas_out, quotas_in,
+               GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL,
+               &get_preferences_cb, NULL,
+               &get_property_cb, NULL);
   if (NULL == mlp)
   {
        GNUNET_break (0);
@@ -338,16 +347,16 @@
                        {
                                        cur_addr = perf_create_address(cp, ca);
                                        /* add address */
-                                       GAS_mlp_address_add (mlp, addresses, 
cur_addr, GNUNET_ATS_NET_UNSPECIFIED);
+                                       GAS_mlp_address_add (mlp, cur_addr, 
GNUNET_ATS_NET_UNSPECIFIED);
                                        address_initial_update (mlp, addresses, 
cur_addr);
                                        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
"Adding address for peer %u address %u: \n", cp, ca);
                        }
-                       GAS_mlp_get_preferred_address( mlp, addresses, 
&peers[cp].id);
+                       GAS_mlp_get_preferred_address( mlp, &peers[cp].id);
                        /* solve */
                        if (cp + 1 >= N_peers_start)
                        {
                                /* Solve the full problem */
-                               GAS_mlp_solve_problem (mlp, addresses);
+                               GAS_mlp_solve_problem (mlp);
                                full_lp_res = mlp->ps.lp_res;
                                full_mip_res = mlp->ps.mip_res;
                                full_lp_presolv = mlp->ps.lp_presolv;
@@ -361,8 +370,8 @@
                                {
                                        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
"Updating problem with %u peers and %u addresses\n", cp + 1, ca);
                                        update_addresses (cp + 1, ca, 
opt_update_quantity);
-                                       GAS_mlp_solve_problem (mlp, addresses);
-                                       GAS_mlp_solve_problem (mlp, addresses);
+                                       GAS_mlp_solve_problem (mlp);
+                                       GAS_mlp_solve_problem (mlp);
                                        update_lp_res = mlp->ps.lp_res;
                                        update_mip_res = mlp->ps.mip_res;
                                        update_lp_presolv = mlp->ps.lp_presolv;
@@ -418,7 +427,7 @@
        {
                        for (cur = peers[cp].head; cur != NULL; cur = next)
                        {
-                                       GAS_mlp_address_delete (mlp, addresses, 
cur, GNUNET_NO);
+                                       GAS_mlp_address_delete (mlp, cur, 
GNUNET_NO);
                                        next = cur->next;
                                        GNUNET_CONTAINER_DLL_remove 
(peers[cp].head, peers[cp].tail, cur);
                                        GNUNET_free (cur);

Modified: gnunet/src/ats/test_ats_api.conf
===================================================================
--- gnunet/src/ats/test_ats_api.conf    2013-07-03 11:55:28 UTC (rev 27732)
+++ gnunet/src/ats/test_ats_api.conf    2013-07-03 13:40:31 UTC (rev 27733)
@@ -7,7 +7,7 @@
 UNIXPATH = /tmp/test-ats-scheduling-arm.sock
 
 [ats]
-#PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25
+PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25
 AUTOSTART = YES
 PORT = 12002
 HOSTNAME = localhost

Modified: gnunet/src/ats/test_ats_mlp.c
===================================================================
--- gnunet/src/ats/test_ats_mlp.c       2013-07-03 11:55:28 UTC (rev 27732)
+++ gnunet/src/ats/test_ats_mlp.c       2013-07-03 13:40:31 UTC (rev 27733)
@@ -75,7 +75,7 @@
              void *value)
 {
        struct ATS_Address *address = (struct ATS_Address *) value;
-       GAS_mlp_address_delete (mlp, addresses, address, GNUNET_NO);
+       GAS_mlp_address_delete (mlp, address, GNUNET_NO);
        GNUNET_CONTAINER_multihashmap_remove (addresses, key, value);
   GNUNET_free (address);
        return GNUNET_OK;
@@ -133,6 +133,13 @@
        return GAS_normalization_get_preferences (id);
 }
 
+const double *
+get_property_cb (void *cls, const struct ATS_Address *address)
+{
+       return GAS_normalization_get_properties ((struct ATS_Address *) 
address);
+}
+
+
 static void
 normalized_property_changed_cb (void *cls,
                                                                                
                                 const struct ATS_Address *peer,
@@ -214,8 +221,12 @@
   addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
 
   /* Init MLP solver */
-  mlp  = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in,
-               GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, 
&get_preferences_cb, NULL);
+  mlp  = GAS_mlp_init (cfg, stats, addresses,
+               quotas, quotas_out, quotas_in,
+               GNUNET_ATS_NetworkTypeCount,
+               &bandwidth_changed_cb, NULL,
+               &get_preferences_cb, NULL,
+               &get_property_cb, NULL);
   if (NULL == mlp)
   {
        GNUNET_break (0);
@@ -251,7 +262,7 @@
   GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0],
                GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   /* Adding address 0 */
-  GAS_mlp_address_add (mlp, addresses, address[0], GNUNET_ATS_NET_UNSPECIFIED);
+  GAS_mlp_address_add (mlp, address[0], GNUNET_ATS_NET_UNSPECIFIED);
 
   /* Create address 1 */
   address[1] = create_address (&p[0], "test_plugin1", "test_addr1", 
strlen("test_addr1")+1, 0);
@@ -264,7 +275,7 @@
   GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[1],
                GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   /* Adding address 1*/
-  GAS_mlp_address_add (mlp, addresses, address[1], GNUNET_ATS_NET_UNSPECIFIED);
+  GAS_mlp_address_add (mlp, address[1], GNUNET_ATS_NET_UNSPECIFIED);
 
 
   /* Create address 3 */
@@ -278,22 +289,22 @@
   GNUNET_CONTAINER_multihashmap_put (addresses, &p[1].hashPubKey, address[2],
                GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   /* Adding address 3*/
-  GAS_mlp_address_add (mlp, addresses, address[2], GNUNET_ATS_NET_UNSPECIFIED);
+  GAS_mlp_address_add (mlp, address[2], GNUNET_ATS_NET_UNSPECIFIED);
 
 
   /* Updating address 0*/
   ats.type =  htonl (GNUNET_ATS_NETWORK_TYPE);
   ats.value = htonl (GNUNET_ATS_NET_WAN);
-  GAS_mlp_address_update (mlp, addresses, address[0], 1, GNUNET_NO, &ats, 1);
+  GAS_mlp_address_update (mlp, address[0], 1, GNUNET_NO, &ats, 1);
 
   /* Retrieving preferred address for peer and wait for callback */
-  GAS_mlp_get_preferred_address (mlp, addresses, &p[0]);
-  GAS_mlp_get_preferred_address (mlp, addresses, &p[1]);
+  GAS_mlp_get_preferred_address (mlp, &p[0]);
+  GAS_mlp_get_preferred_address (mlp, &p[1]);
 
   mlp->write_mip_mps = GNUNET_NO;
   mlp->write_mip_sol = GNUNET_NO;
 
-  GAS_mlp_solve_problem (mlp, addresses);
+  GAS_mlp_solve_problem (mlp);
 }
 
 

Modified: gnunet/src/ats/test_ats_mlp_update.c
===================================================================
--- gnunet/src/ats/test_ats_mlp_update.c        2013-07-03 11:55:28 UTC (rev 
27732)
+++ gnunet/src/ats/test_ats_mlp_update.c        2013-07-03 13:40:31 UTC (rev 
27733)
@@ -81,7 +81,7 @@
              void *value)
 {
        struct ATS_Address *address = (struct ATS_Address *) value;
-       GAS_mlp_address_delete (mlp, addresses, address, GNUNET_NO);
+       GAS_mlp_address_delete (mlp, address, GNUNET_NO);
        GNUNET_CONTAINER_multihashmap_remove (addresses, key, value);
   GNUNET_free (address);
        return GNUNET_OK;
@@ -139,6 +139,12 @@
        return GAS_normalization_get_preferences (id);
 }
 
+const double *
+get_property_cb (void *cls, const struct ATS_Address *address)
+{
+       return GAS_normalization_get_properties ((struct ATS_Address *) 
address);
+}
+
 static void
 normalized_property_changed_cb (void *cls,
                                                                                
                                 const struct ATS_Address *peer,
@@ -210,8 +216,12 @@
   addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
 
   /* Init MLP solver */
-  mlp  = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in,
-               GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, 
&get_preferences_cb, NULL);
+  mlp  = GAS_mlp_init (cfg, stats, addresses,
+               quotas, quotas_out, quotas_in,
+               GNUNET_ATS_NetworkTypeCount,
+               &bandwidth_changed_cb, NULL,
+               &get_preferences_cb, NULL,
+               &get_property_cb, NULL);
   if (NULL == mlp)
   {
        GNUNET_break (0);
@@ -239,13 +249,13 @@
   GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0],
                GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
   /* Adding address 0 */
-  GAS_mlp_address_add (mlp, addresses, address[0], GNUNET_ATS_NET_UNSPECIFIED);
+  GAS_mlp_address_add (mlp, address[0], GNUNET_ATS_NET_UNSPECIFIED);
 
   /* Retrieving preferred address for peer and wait for callback */
-  GAS_mlp_get_preferred_address (mlp, addresses, &p[0]);
+  GAS_mlp_get_preferred_address (mlp, &p[0]);
 
   /* Solve problem to build matrix */
-  GAS_mlp_solve_problem (mlp, addresses);
+  GAS_mlp_solve_problem (mlp);
 
   address[0]->atsi = ats;
   address[0]->atsi_count = 4;
@@ -268,10 +278,10 @@
   ats_prev[3].type =  htonl (GNUNET_ATS_ARRAY_TERMINATOR);
   ats_prev[3].value = htonl (GNUNET_ATS_VALUE_UNDEFINED);
 
-  GAS_mlp_address_update (mlp, addresses, address[0], 1, GNUNET_NO, ats_prev, 
4);
+  GAS_mlp_address_update (mlp, address[0], 1, GNUNET_NO, ats_prev, 4);
 
   /* Solve problem to build matrix */
-  GAS_mlp_solve_problem (mlp, addresses);
+  GAS_mlp_solve_problem (mlp);
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]