From: Matthias Wachs Date: Thu, 19 Jan 2012 17:29:18 +0000 (+0000) Subject: - latest changes X-Git-Tag: initial-import-from-subversion-38251~15215 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3ffb89c725b34356c961bb827b5f83002d083191;p=oweals%2Fgnunet.git - latest changes --- diff --git a/src/ats/Makefile.am b/src/ats/Makefile.am index 1f8a84a67..5b7e9a127 100644 --- a/src/ats/Makefile.am +++ b/src/ats/Makefile.am @@ -17,6 +17,7 @@ if HAVE_LIBGLPK 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 @@ -52,7 +53,8 @@ gnunet_service_ats_LDADD = \ 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 @@ -68,6 +70,14 @@ test_ats_mlp_LDADD = \ $(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 = \ diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c index 17b4697d4..fa4d3a106 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.c +++ b/src/ats/gnunet-service-ats_addresses_mlp.c @@ -32,7 +32,7 @@ #include "glpk.h" #define WRITE_MLP GNUNET_NO -#define DEBUG_ATS GNUNET_YES +#define DEBUG_ATS GNUNET_NO #define VERBOSE_GLPK GNUNET_NO /** @@ -314,7 +314,7 @@ static void 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*/ @@ -356,7 +356,7 @@ mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CON * * c 7) quality * #rows: |quality properties| - * #indices:|quality properties| + |n_addresses| + * #indices: |n_addresses| + |quality properties| * * c 8) utilization * #rows: 1 @@ -367,7 +367,8 @@ mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CON * #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; @@ -453,7 +454,6 @@ mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CON /* 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)); @@ -492,23 +492,44 @@ mlp_add_constraints_all_addresses (struct GAS_MLP_Handle *mlp, struct GNUNET_CON 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; } } -*/ } @@ -575,12 +596,10 @@ static int 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 */ @@ -625,7 +644,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas 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++) @@ -639,7 +658,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas /* 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); @@ -1130,6 +1149,8 @@ GAS_mlp_address_update (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_Mult #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 */ diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h index f5c243071..d4ae089b4 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.h +++ b/src/ats/gnunet-service-ats_addresses_mlp.h @@ -207,6 +207,9 @@ struct GAS_MLP_Handle /* 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]; diff --git a/src/ats/perf_ats_mlp.c b/src/ats/perf_ats_mlp.c new file mode 100644 index 000000000..79a362115 --- /dev/null +++ b/src/ats/perf_ats_mlp.c @@ -0,0 +1,138 @@ +/* + 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 */ diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c index 145e748b8..bf0c6a10a 100644 --- a/src/ats/test_ats_mlp.c +++ b/src/ats/test_ats_mlp.c @@ -65,7 +65,7 @@ check (void *cls, char *const *args, const char *cfgfile, 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; @@ -86,7 +86,7 @@ check (void *cls, char *const *args, const char *cfgfile, 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);