GN_LIBGLPK = -lglpk
GN_MLP_SRC = gnunet-service-ats_addresses_mlp.c gnunet-service-ats_addresses_mlp.h
GN_MLP_TEST = test_ats_mlp
+ GN_MLP_PERF = perf_ats_mlp
endif
lib_LTLIBRARIES = libgnunetats.la
check_PROGRAMS = \
test_ats_api_scheduling \
- $(GN_MLP_TEST)
+ $(GN_MLP_TEST) \
+ $(GN_MLP_PERF)
# test_ats_api_scheduling_get_type
# test_ats_api_bandwidth_consumption
$(GN_LIBGLPK) \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la
+
+perf_ats_mlp_SOURCES = \
+ $(GN_MLP_SRC) \
+ perf_ats_mlp.c
+perf_ats_mlp_LDADD = \
+ $(GN_LIBGLPK) \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(top_builddir)/src/statistics/libgnunetstatistics.la
endif
test_ats_api_scheduling_SOURCES = \
#include "glpk.h"
#define WRITE_MLP GNUNET_NO
-#define DEBUG_ATS GNUNET_YES
+#define DEBUG_ATS GNUNET_NO
#define VERBOSE_GLPK GNUNET_NO
/**
mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses)
{
unsigned int n_addresses;
- //int c;
+ int c;
char *name;
/* Problem matrix*/
*
* c 7) quality
* #rows: |quality properties|
- * #indices:|quality properties| + |n_addresses|
+ * #indices: |n_addresses| + |quality properties|
*
* c 8) utilization
* #rows: 1
* #indices: |n_addresses| + |peers|
* */
- int pi = ((7 * n_addresses) + (3 * n_addresses + mlp->m_q + 2));
+ /* last +1 caused by glpk index starting with one */
+ int pi = ((7 * n_addresses) + (4 * n_addresses + mlp->m_q + mlp->c_p + 2) + 1);
mlp->cm_size = pi;
mlp->ci = 1;
/* Set row bound == 1 */
glp_set_row_bnds (mlp->prob, peer->r_c2, GLP_FX, 1.0, 1.0);
-
/* Adding rows for c 9) */
peer->r_c9 = glp_add_rows (mlp->prob, 1);
GNUNET_asprintf(&name, "c9_%s", GNUNET_i2s(&peer->id));
peer = peer->next;
}
+ /* c 7) For all quality metrics */
- /* For all quality metrics */
-/*
for (c = 0; c < mlp->m_q; c++)
{
struct ATS_Peer *p = mlp->peer_head;
+ struct ATS_Address *addr = p->head;
+ struct MLP_information * mlpi;
+ double value = 1.0;
+
while (p != NULL)
{
- ia[mlp->ci] = row_index;
+ /* Adding rows for c 7) */
+ mlp->r_q[c] = glp_add_rows (mlp->prob, 1);
+ GNUNET_asprintf(&name, "c7_q%i_atsi_%i", c, mlp->q[c]);
+ glp_set_row_name (mlp->prob, mlp->r_q[c], name);
+ GNUNET_free (name);
+ /* Set row bound == 0 */
+ glp_set_row_bnds (mlp->prob, mlp->r_q[c], GLP_LO, 0.0, 0.0);
+
+ /* Set -q_m */
+ ia[mlp->ci] = mlp->r_q[c];
ja[mlp->ci] = mlp->c_q[c];
- ar[mlp->ci] = mlp->;
+ ar[mlp->ci] = -1;
mlp->ci++;
+ while (addr != NULL)
+ {
+ mlpi = addr->mlp_information;
+ ia[mlp->ci] = mlp->r_q[c];
+ ja[mlp->ci] = mlpi->c_b;
+ ar[mlp->ci] = p->f * value;
+ mlp->ci++;
+
+ addr = addr->next;
+ }
p = p->next;
}
}
-*/
}
mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses)
{
int res = GNUNET_OK;
-
int col;
-/*
int c;
char *name;
-*/
+
GNUNET_assert (mlp->prob == NULL);
/* create the glpk problem */
glp_set_obj_coef (mlp->prob, col, mlp->co_R);
/* Column lower bound = 0.0 */
glp_set_col_bnds (mlp->prob, col, GLP_LO, 0.0, 0.0);
-#if 0
+
/* Quality metric columns */
col = glp_add_cols(mlp->prob, mlp->m_q);
for (c = 0; c < mlp->m_q; c++)
/* Coefficient == Qm */
glp_set_obj_coef (mlp->prob, col + c, mlp->co_Q[c]);
}
-#endif
+
/* Add columns for addresses */
GNUNET_CONTAINER_multihashmap_iterate (addresses, create_columns_it, mlp);
#if DEBUG_ATS
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Updating existing address to peer `%s'\n", GNUNET_i2s (&address->peer));
#endif
+ mlpi = address->mlp_information;
+
}
/* Recalculate */
/* column index quality metrics */
int c_q[GNUNET_ATS_QualityPropertiesCount];
+ /* column index quality metrics */
+ int r_q[GNUNET_ATS_QualityPropertiesCount];
+
/* quality metric coefficients*/
double co_Q[GNUNET_ATS_QualityPropertiesCount];
--- /dev/null
+/*
+ This file is part of GNUnet.
+ (C) 2010,2011 Christian Grothoff (and other contributing authors)
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+/**
+ * @file ats/test_ats_mlp.c
+ * @brief test for the MLP solver
+ * @author Christian Grothoff
+ * @author Matthias Wachs
+
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_statistics_service.h"
+#include "gnunet-service-ats_addresses_mlp.h"
+
+#define VERBOSE GNUNET_YES
+#define VERBOSE_ARM GNUNET_EXTRA_LOGGING
+
+#define MLP_MAX_EXEC_DURATION GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3)
+#define MLP_MAX_ITERATIONS INT_MAX
+
+
+static int ret;
+
+struct GNUNET_STATISTICS_Handle * stats;
+
+struct GNUNET_CONTAINER_MultiHashMap * addresses;
+
+struct GAS_MLP_Handle *mlp;
+
+static void
+check (void *cls, char *const *args, const char *cfgfile,
+ const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+#if !HAVE_LIBGLPK
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "GLPK not installed!");
+ ret = 1;
+ return;
+#endif
+ struct ATS_Address addr[10];
+
+ stats = GNUNET_STATISTICS_create("ats", cfg);
+
+ addresses = GNUNET_CONTAINER_multihashmap_create (10);
+
+ GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, &addr[0].peer.hashPubKey);
+ addr[0].mlp_information = NULL;
+ addr[0].next = NULL;
+ addr[0].prev = NULL;
+ addr[0].plugin = strdup ("dummy");
+
+ addr[1].peer = addr[0].peer;
+ addr[1].mlp_information = NULL;
+ addr[1].next = NULL;
+ addr[1].prev = NULL;
+ addr[1].plugin = strdup ("dummy2");
+
+ GNUNET_CONTAINER_multihashmap_put(addresses, &addr[0].peer.hashPubKey, &addr[0], GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+
+ mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
+
+ /* Add a new address */
+#if 0
+ GAS_mlp_address_update (mlp, addresses, &addr[0]);
+
+ GNUNET_assert (mlp != NULL);
+ GNUNET_assert (mlp->addr_in_problem == 1);
+
+ /* Update an new address */
+ GAS_mlp_address_update (mlp, addresses, &addr[0]);
+ GNUNET_assert (mlp->addr_in_problem == 1);
+
+ /* Add a second address for same peer */
+ GNUNET_CONTAINER_multihashmap_put(addresses, &addr[0].peer.hashPubKey, &addr[1], GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+ GAS_mlp_address_update (mlp, addresses, &addr[1]);
+ GNUNET_assert (mlp->addr_in_problem == 2);
+
+ /* Delete an address */
+ GNUNET_CONTAINER_multihashmap_remove (addresses, &addr[0].peer.hashPubKey, &addr[0]);
+ GAS_mlp_address_delete (mlp, addresses, &addr[0]);
+ GAS_mlp_address_delete (mlp, addresses, &addr[1]);
+#endif
+ GAS_mlp_done (mlp);
+
+ GNUNET_free (addr[0].plugin);
+ GNUNET_free (addr[1].plugin);
+ GNUNET_CONTAINER_multihashmap_destroy (addresses);
+ GNUNET_STATISTICS_destroy(stats, GNUNET_NO);
+
+ ret = 0;
+ return;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+
+ static char *const argv2[] = { "test_ats_mlp",
+ "-c",
+ "test_ats_api.conf",
+#if VERBOSE
+ "-L", "DEBUG",
+#else
+ "-L", "WARNING",
+#endif
+ NULL
+ };
+
+ static struct GNUNET_GETOPT_CommandLineOption options[] = {
+ GNUNET_GETOPT_OPTION_END
+ };
+
+ GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2,
+ "test_ats_mlp", "nohelp", options,
+ &check, NULL);
+
+
+ return ret;
+}
+
+/* end of file test_ats_api_bandwidth_consumption.c */
addr[0].prev = NULL;
addr[0].plugin = strdup ("dummy");
- addr[1].peer = addr[0].peer;
+ GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, &addr[1].peer.hashPubKey);
addr[1].mlp_information = NULL;
addr[1].next = NULL;
addr[1].prev = NULL;
GNUNET_assert (mlp->addr_in_problem == 1);
/* Add a second address for same peer */
- GNUNET_CONTAINER_multihashmap_put(addresses, &addr[0].peer.hashPubKey, &addr[1], GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+ GNUNET_CONTAINER_multihashmap_put(addresses, &addr[1].peer.hashPubKey, &addr[1], GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
GAS_mlp_address_update (mlp, addresses, &addr[1]);
GNUNET_assert (mlp->addr_in_problem == 2);