gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r26189 - gnunet/src/ats
Date: Fri, 22 Feb 2013 15:17:57 +0100

Author: wachs
Date: 2013-02-22 15:17:57 +0100 (Fri, 22 Feb 2013)
New Revision: 26189

Modified:
   gnunet/src/ats/gnunet-service-ats_addresses_mlp.c
Log:
changes


Modified: gnunet/src/ats/gnunet-service-ats_addresses_mlp.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses_mlp.c   2013-02-22 13:32:12 UTC 
(rev 26188)
+++ gnunet/src/ats/gnunet-service-ats_addresses_mlp.c   2013-02-22 14:17:57 UTC 
(rev 26189)
@@ -815,15 +815,6 @@
    */
 
 
-  /* Setting -D */
-  ia[p->ci] = p->r_c6 ;
-  ja[p->ci] = p->c_d;
-  ar[p->ci] = -1;
-#if  DEBUG_MLP_PROBLEM_CREATION
-       LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Set value [%u,%u] ==  %.2f\n",
-                       ia[p->ci], ja[p->ci], ar[p->ci]);
-#endif
-  p->ci++;
 
   GNUNET_CONTAINER_multihashmap_iterate (addresses, mlp_create_constraint_it, 
mlp);
 
@@ -841,16 +832,6 @@
    * V p : sum (bt_1 + ... +bt_n) - f_p * r = 0
    * */
 
-  /* -u */
-  ia[p->ci] = p->r_c8;
-  ja[p->ci] = p->c_u;
-  ar[p->ci] = -1;
-#if  DEBUG_MLP_PROBLEM_CREATION
-       LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Set value [%u,%u] ==  %.2f\n",
-                       ia[p->ci], ja[p->ci], ar[p->ci]);
-#endif
-  p->ci++;
-
 #if 0
   struct ATS_Peer * peer = mlp->peer_head;
   /* For all peers */
@@ -1064,13 +1045,54 @@
 }
 #endif
 
+
+struct CountContext
+{
+       struct GNUNET_CONTAINER_MultiHashMap * peers;
+       int result;
+};
+
+static int
+mlp_create_problem_count_addresses_it (void *cls, const struct GNUNET_HashCode 
*key, void *value)
+{
+       struct CountContext *cctx = cls;
+  /* Check if we have to add this peer due to a pending request */
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(cctx->peers, key))
+       cctx->result++;
+  return GNUNET_OK;
+}
+
+static int mlp_create_problem_count_addresses (
+               struct GNUNET_CONTAINER_MultiHashMap * peers,
+               struct GNUNET_CONTAINER_MultiHashMap * addresses)
+{
+       struct CountContext cctx;
+       cctx.peers = peers;
+       cctx.result = 0;
+  GNUNET_CONTAINER_multihashmap_iterate (addresses, 
&mlp_create_problem_count_addresses_it, &cctx);
+  return cctx.result;
+}
+
+
 /**
- * Create the invariant columns c4, c6, c10, c8, c7
+ * Create the
+ * - address columns b and n
+ * - address dependent constraint rows c1, c3
+ * - peer dependent rows c2 and c9
+ * - Set address dependent entries in problem matrix as well
  */
 static void
 mlp_create_problem_add_address_information (struct GAS_MLP_Handle *mlp, struct 
MLP_Problem *p)
 {
+       /* Add peer dependent constraints */
+       /* Add constraint c2 */
+       /* Add constraint c9 */
 
+       /* Add address dependent constraints */
+       /* Add constraint c1 */
+       /* Add constraint c3 */
+
+
 }
 
 
@@ -1109,7 +1131,17 @@
                        p->r_c6, name,
                        "==", 0);
 #endif
+  /* c6 )Setting -D */
+  p->ia[p->ci] = p->r_c6 ;
+  p->ja[p->ci] = p->c_d;
+  p->ar[p->ci] = -1;
+#if  DEBUG_MLP_PROBLEM_CREATION
+       LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Set value [%u,%u] ==  %.2f\n",
+                       p->ia[p->ci], p->ja[p->ci], p->ar[p->ci]);
+#endif
+  p->ci++;
 
+
   /* Add rows for c 10) */
   for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
   {
@@ -1138,7 +1170,17 @@
                                p->r_c8, name,
                                "==", 0);
 #endif
+  /* -u */
+       p->ia[p->ci] = p->r_c8;
+       p->ja[p->ci] = p->c_u;
+       p->ar[p->ci] = -1;
+#if  DEBUG_MLP_PROBLEM_CREATION
+       LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Set value [%u,%u] ==  %.2f\n",
+                       p->ia[p->ci], p->ja[p->ci], p->ar[p->ci]);
+#endif
+  p->ci++;
 
+
        /* c 7) For all quality metrics */
        for (c = 0; c < mlp->pv.m_q; c++)
        {
@@ -1150,9 +1192,17 @@
 #if  DEBUG_MLP_PROBLEM_CREATION
                LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s 
%u\n",
                                p->r_q[c], name,
-                               "<=", 0);
+                               "==", 0);
 #endif
                GNUNET_free (name);
+               p->ia[p->ci] = p->r_q[c];
+               p->ja[p->ci] = p->c_q[c];
+               p->ar[p->ci] = -1;
+#if  DEBUG_MLP_PROBLEM_CREATION
+               LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Set value [%u,%u] ==  
%.2f\n",
+                               p->ia[p->ci], p->ja[p->ci], p->ar[p->ci]);
+#endif
+    p->ci++;
        }
 }
 
@@ -1239,30 +1289,42 @@
 {
   struct MLP_Problem *p = &mlp->p;
        int res = GNUNET_OK;
+       int elements;
 
-       LOG (GNUNET_ERROR_TYPE_DEBUG, "Rebuilding problem for %u peer(s) \n",
-                       GNUNET_CONTAINER_multihashmap_size(mlp->peers));
-
   GNUNET_assert (p->prob == NULL);
   GNUNET_assert (p->ia == NULL);
   GNUNET_assert (p->ja == NULL);
   GNUNET_assert (p->ar == NULL);
-
-
   /* Reset MLP problem struct */
-  p->num_addresses = 0;
-  p->num_peers = GNUNET_CONTAINER_multihashmap_size (mlp->peers);
 
   /* create the glpk problem */
   p->prob = glp_create_prob ();
-  p->num_addresses = 0;;
   GNUNET_assert (NULL != p->prob);
+  p->num_peers = GNUNET_CONTAINER_multihashmap_size (mlp->peers);
+  p->num_addresses = mlp_create_problem_count_addresses (addresses, 
mlp->peers);
 
+       LOG (GNUNET_ERROR_TYPE_DEBUG, "Rebuilding problem for %u peer(s) and %u 
addresse(s)\n",
+                       p->num_peers, p->num_addresses);
+
   /* Set a problem name */
   glp_set_prob_name (p->prob, "GNUnet ats bandwidth distribution");
   /* Set optimization direction to maximize */
   glp_set_obj_dir (p->prob, GLP_MAX);
 
+  /* Create problem matrix */
+  /* last +1 caused by glpk index starting with one: [1..elements]*/
+  elements = ((7 * p->num_addresses) + (5 * p->num_addresses +  mlp->pv.m_q + 
p->num_peers + 2) + 1);
+  p->ci = 1;
+  /* row index */
+  int *ia = GNUNET_malloc (elements * sizeof (int));
+  p->ia = ia;
+  /* column index */
+  int *ja = GNUNET_malloc (elements * sizeof (int));
+  p->ja = ja;
+  /* coefficient */
+  double *ar= GNUNET_malloc (elements * sizeof (double));
+  p->ar = ar;
+
   /* Adding invariant columns */
   mlp_create_problem_add_invariant_columns (mlp, p);
 
@@ -1274,13 +1336,13 @@
 
 #if 0
   /* Add columns for addresses */
-  GNUNET_CONTAINER_multihashmap_iterate (addresses, 
mlp_create_address_columns_it, mlp);
+  GNUNET_CONTAINER_multihashmap_iterate (peers, mlp_create_address_columns_it, 
mlp);
        LOG (GNUNET_ERROR_TYPE_DEBUG, "Problems contains %u peers, %u 
addresses, %u addresses skipped \n",
                        GNUNET_CONTAINER_multihashmap_size(mlp->peers),
-                       p->num_addresses, 
GNUNET_CONTAINER_multihashmap_size(addresses)- p->num_addresses);
+                       p->num_addresses, 
GNUNET_CONTAINER_multihashmap_size(peers)- p->num_addresses);
 
   /* Add constraints rows */
-  mlp_add_constraints_all_addresses (mlp, addresses);
+  mlp_add_constraints_all_addresses (mlp, peers);
 # endif
 
   /* Load the matrix */
@@ -1786,7 +1848,7 @@
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Recreating problem: new address\n");
 
     mlp_delete_problem (mlp);
-    mlp_create_problem (mlp, addresses);
+    mlp_create_problem (mlp, peers);
     mlp->presolver_required = GNUNET_YES;
   }
   if (mlp->auto_solve == GNUNET_YES)
@@ -1876,9 +1938,9 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Recreating problem: new address\n");
 
   mlp_delete_problem (mlp);
-  if ((GNUNET_CONTAINER_multihashmap_size (addresses) > 0) && (mlp->c_p > 0))
+  if ((GNUNET_CONTAINER_multihashmap_size (peers) > 0) && (mlp->c_p > 0))
   {
-    mlp_create_problem (mlp, addresses);
+    mlp_create_problem (mlp, peers);
 
     /* Recalculate */
     mlp->presolver_required = GNUNET_YES;




reply via email to

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