From d41ed82a4ea0cc8e1674b6d5d2c49fd6462610bb Mon Sep 17 00:00:00 2001 From: ng0 Date: Sun, 8 Sep 2019 12:33:09 +0000 Subject: uncrustify as demanded. --- src/ats/plugin_ats_mlp.c | 2260 +++++++++++++++++++++++----------------------- 1 file changed, 1154 insertions(+), 1106 deletions(-) (limited to 'src/ats/plugin_ats_mlp.c') diff --git a/src/ats/plugin_ats_mlp.c b/src/ats/plugin_ats_mlp.c index 0f3a727a7..8d3c9e23a 100644 --- a/src/ats/plugin_ats_mlp.c +++ b/src/ats/plugin_ats_mlp.c @@ -11,12 +11,12 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . SPDX-License-Identifier: AGPL3.0-or-later -*/ + */ /** * @file ats/plugin_ats_mlp.c @@ -34,7 +34,7 @@ #include -#define BIG_M_VALUE (UINT32_MAX) /10 +#define BIG_M_VALUE (UINT32_MAX) / 10 #define BIG_M_STRING "unlimited" #define MLP_AVERAGING_QUEUE_LENGTH 3 @@ -54,16 +54,14 @@ #define GLP_YES 1.0 #define GLP_NO 0.0 -enum MLP_Output_Format -{ +enum MLP_Output_Format { MLP_MPS, MLP_CPLEX, MLP_GLPK }; -enum QualityMetrics -{ +enum QualityMetrics { RQ_QUALITY_METRIC_DELAY = 0, RQ_QUALITY_METRIC_DISTANCE = 1, RQ_QUALITY_METRIC_COUNT = 2 @@ -71,22 +69,24 @@ enum QualityMetrics static const char * -print_quality_type (enum QualityMetrics qm) +print_quality_type(enum QualityMetrics qm) { - switch (qm){ - case RQ_QUALITY_METRIC_DELAY: - return "delay"; - case RQ_QUALITY_METRIC_DISTANCE: - return "distance"; - default: - GNUNET_break (0); - return NULL; - } + switch (qm) + { + case RQ_QUALITY_METRIC_DELAY: + return "delay"; + + case RQ_QUALITY_METRIC_DISTANCE: + return "distance"; + + default: + GNUNET_break(0); + return NULL; + } } -struct MLP_Solution -{ +struct MLP_Solution { int lp_res; int lp_presolv; int mip_res; @@ -103,11 +103,9 @@ struct MLP_Solution int n_peers; int n_addresses; - }; -struct ATS_Peer -{ +struct ATS_Peer { struct GNUNET_PeerIdentity id; /* Was this peer already added to the current problem? */ @@ -123,8 +121,7 @@ struct ATS_Peer double f; }; -struct MLP_Problem -{ +struct MLP_Problem { /** * GLPK (MLP) problem object */ @@ -170,11 +167,9 @@ struct MLP_Problem int *ja; /* Column index value */ double *ar; - }; -struct MLP_Variables -{ +struct MLP_Variables { /* Big M value for bandwidth capping */ double BIG_M; @@ -225,14 +220,12 @@ struct MLP_Variables * contains mapping to GNUNET_ATS_Property * */ int rc[RQ_QUALITY_METRIC_COUNT]; - }; /** * MLP Handle */ -struct GAS_MLP_Handle -{ +struct GAS_MLP_Handle { struct GNUNET_ATS_PluginEnvironment *env; /** @@ -367,9 +360,7 @@ struct GAS_MLP_Handle /** * Address specific MLP information */ -struct MLP_information -{ - +struct MLP_information { /** * Bandwidth assigned outbound */ @@ -512,7 +503,7 @@ struct MLP_information */ -#define LOG(kind,...) GNUNET_log_from (kind, "ats-mlp",__VA_ARGS__) +#define LOG(kind, ...) GNUNET_log_from(kind, "ats-mlp", __VA_ARGS__) /** * Print debug output for mlp problem creation @@ -527,12 +518,12 @@ struct MLP_information * @return 0: glpk prints output on terminal, 0 != surpress output */ static int -mlp_term_hook (void *info, const char *s) +mlp_term_hook(void *info, const char *s) { struct GAS_MLP_Handle *mlp = info; if (mlp->opt_dbg_glpk_verbose) - LOG (GNUNET_ERROR_TYPE_ERROR, "%s", s); + LOG(GNUNET_ERROR_TYPE_ERROR, "%s", s); return 1; } @@ -546,14 +537,15 @@ mlp_term_hook (void *info, const char *s) * @return #GNUNET_OK */ static int -reset_peers (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) - { - struct ATS_Peer *peer = value; - peer->processed = GNUNET_NO; - return GNUNET_OK; - } +reset_peers(void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) +{ + struct ATS_Peer *peer = value; + + peer->processed = GNUNET_NO; + return GNUNET_OK; +} /** * Delete the MLP problem and free the constrain matrix @@ -561,37 +553,38 @@ reset_peers (void *cls, * @param mlp the MLP handle */ static void -mlp_delete_problem (struct GAS_MLP_Handle *mlp) +mlp_delete_problem(struct GAS_MLP_Handle *mlp) { int c; + if (mlp == NULL) return; if (mlp->p.prob != NULL) - { - glp_delete_prob(mlp->p.prob); - mlp->p.prob = NULL; - } + { + glp_delete_prob(mlp->p.prob); + mlp->p.prob = NULL; + } /* delete row index */ if (mlp->p.ia != NULL) - { - GNUNET_free (mlp->p.ia); - mlp->p.ia = NULL; - } + { + GNUNET_free(mlp->p.ia); + mlp->p.ia = NULL; + } /* delete column index */ if (mlp->p.ja != NULL) - { - GNUNET_free (mlp->p.ja); - mlp->p.ja = NULL; - } + { + GNUNET_free(mlp->p.ja); + mlp->p.ja = NULL; + } /* delete coefficients */ if (mlp->p.ar != NULL) - { - GNUNET_free (mlp->p.ar); - mlp->p.ar = NULL; - } + { + GNUNET_free(mlp->p.ar); + mlp->p.ar = NULL; + } mlp->p.ci = 0; mlp->p.prob = NULL; @@ -601,15 +594,15 @@ mlp_delete_problem (struct GAS_MLP_Handle *mlp) mlp->p.r_c4 = MLP_UNDEFINED; mlp->p.r_c6 = MLP_UNDEFINED; mlp->p.r_c9 = MLP_UNDEFINED; - for (c = 0; c < RQ_QUALITY_METRIC_COUNT ; c ++) + for (c = 0; c < RQ_QUALITY_METRIC_COUNT; c++) mlp->p.r_q[c] = MLP_UNDEFINED; - for (c = 0; c < GNUNET_NT_COUNT; c ++) + for (c = 0; c < GNUNET_NT_COUNT; c++) mlp->p.r_quota[c] = MLP_UNDEFINED; mlp->p.ci = MLP_UNDEFINED; - GNUNET_CONTAINER_multipeermap_iterate (mlp->requested_peers, - &reset_peers, NULL); + GNUNET_CONTAINER_multipeermap_iterate(mlp->requested_peers, + &reset_peers, NULL); } @@ -619,25 +612,32 @@ mlp_delete_problem (struct GAS_MLP_Handle *mlp) * @return string with result */ static const char * -mlp_status_to_string (int retcode) +mlp_status_to_string(int retcode) { - switch (retcode) { + switch (retcode) + { case GLP_UNDEF: return "solution is undefined"; + case GLP_FEAS: return "solution is feasible"; + case GLP_INFEAS: return "solution is infeasible"; + case GLP_NOFEAS: return "no feasible solution exists"; + case GLP_OPT: return "solution is optimal"; + case GLP_UNBND: return "solution is unbounded"; + default: - GNUNET_break (0); + GNUNET_break(0); return "unknown error"; - } + } } @@ -647,114 +647,134 @@ mlp_status_to_string (int retcode) * @return string with result */ static const char * -mlp_solve_to_string (int retcode) +mlp_solve_to_string(int retcode) { - switch (retcode) { + switch (retcode) + { case 0: return "ok"; + case GLP_EBADB: return "invalid basis"; + case GLP_ESING: return "singular matrix"; + case GLP_ECOND: return "ill-conditioned matrix"; + case GLP_EBOUND: return "invalid bounds"; + case GLP_EFAIL: return "solver failed"; + case GLP_EOBJLL: return "objective lower limit reached"; + case GLP_EOBJUL: return "objective upper limit reached"; + case GLP_EITLIM: return "iteration limit exceeded"; + case GLP_ETMLIM: return "time limit exceeded"; + case GLP_ENOPFS: return "no primal feasible solution"; + case GLP_ENODFS: return "no dual feasible solution"; + case GLP_EROOT: return "root LP optimum not provided"; + case GLP_ESTOP: return "search terminated by application"; + case GLP_EMIPGAP: return "relative mip gap tolerance reached"; + case GLP_ENOFEAS: return "no dual feasible solution"; + case GLP_ENOCVG: return "no convergence"; + case GLP_EINSTAB: return "numerical instability"; + case GLP_EDATA: return "invalid data"; + case GLP_ERANGE: return "result out of range"; + default: - GNUNET_break (0); + GNUNET_break(0); return "unknown error"; - } + } } -struct CountContext -{ +struct CountContext { const struct GNUNET_CONTAINER_MultiPeerMap *map; int result; }; static int -mlp_create_problem_count_addresses_it (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) +mlp_create_problem_count_addresses_it(void *cls, + const struct GNUNET_PeerIdentity *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_multipeermap_contains (cctx->map, key)) + if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains(cctx->map, key)) cctx->result++; return GNUNET_OK; } static int -mlp_create_problem_count_addresses (const struct GNUNET_CONTAINER_MultiPeerMap *requested_peers, - const struct GNUNET_CONTAINER_MultiPeerMap *addresses) +mlp_create_problem_count_addresses(const struct GNUNET_CONTAINER_MultiPeerMap *requested_peers, + const struct GNUNET_CONTAINER_MultiPeerMap *addresses) { struct CountContext cctx; cctx.map = requested_peers; cctx.result = 0; - GNUNET_CONTAINER_multipeermap_iterate (addresses, - &mlp_create_problem_count_addresses_it, &cctx); + GNUNET_CONTAINER_multipeermap_iterate(addresses, + &mlp_create_problem_count_addresses_it, &cctx); return cctx.result; } static int -mlp_create_problem_count_peers_it (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) +mlp_create_problem_count_peers_it(void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) { struct CountContext *cctx = cls; /* Check if we have to addresses for the requested peer */ - if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (cctx->map, key)) + if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains(cctx->map, key)) cctx->result++; return GNUNET_OK; } static int -mlp_create_problem_count_peers (const struct GNUNET_CONTAINER_MultiPeerMap *requested_peers, - const struct GNUNET_CONTAINER_MultiPeerMap *addresses) +mlp_create_problem_count_peers(const struct GNUNET_CONTAINER_MultiPeerMap *requested_peers, + const struct GNUNET_CONTAINER_MultiPeerMap *addresses) { struct CountContext cctx; cctx.map = addresses; cctx.result = 0; - GNUNET_CONTAINER_multipeermap_iterate (requested_peers, - &mlp_create_problem_count_peers_it, &cctx); + GNUNET_CONTAINER_multipeermap_iterate(requested_peers, + &mlp_create_problem_count_peers_it, &cctx); return cctx.result; } @@ -773,9 +793,9 @@ mlp_create_problem_count_peers (const struct GNUNET_CONTAINER_MultiPeerMap *requ * on error */ static int -mlp_create_problem_update_value (struct MLP_Problem *p, - int row, int col, double val, - int line) +mlp_create_problem_update_value(struct MLP_Problem *p, + int row, int col, double val, + int line) { int c_cols; int c_elems; @@ -785,59 +805,59 @@ mlp_create_problem_update_value (struct MLP_Problem *p, double *val_array; int *ind_array; - GNUNET_assert (NULL != p->prob); + GNUNET_assert(NULL != p->prob); /* Get number of columns and prepare data structure */ c_cols = glp_get_num_cols(p->prob); if (0 >= c_cols) return GNUNET_SYSERR; - val_array = GNUNET_malloc ((c_cols +1)* sizeof (double)); - GNUNET_assert (NULL != val_array); - ind_array = GNUNET_malloc ((c_cols+1) * sizeof (int)); - GNUNET_assert (NULL != ind_array); + val_array = GNUNET_malloc((c_cols + 1) * sizeof(double)); + GNUNET_assert(NULL != val_array); + ind_array = GNUNET_malloc((c_cols + 1) * sizeof(int)); + GNUNET_assert(NULL != ind_array); /* Extract the row */ /* Update the value */ - c_elems = glp_get_mat_row (p->prob, row, ind_array, val_array); + c_elems = glp_get_mat_row(p->prob, row, ind_array, val_array); found = GNUNET_NO; - for (c1 = 1; c1 < (c_elems+1); c1++) - { - if (ind_array[c1] == col) + for (c1 = 1; c1 < (c_elems + 1); c1++) { - found = GNUNET_YES; - break; + if (ind_array[c1] == col) + { + found = GNUNET_YES; + break; + } } - } if (GNUNET_NO == found) - { - ind_array[c_elems+1] = col; - val_array[c_elems+1] = val; - LOG (GNUNET_ERROR_TYPE_DEBUG, "[P] Setting value in [%s : %s] to `%.2f'\n", - glp_get_row_name (p->prob, row), glp_get_col_name (p->prob, col), - val); - glp_set_mat_row (p->prob, row, c_elems+1, ind_array, val_array); - GNUNET_free (ind_array); - GNUNET_free (val_array); - return GNUNET_YES; - } + { + ind_array[c_elems + 1] = col; + val_array[c_elems + 1] = val; + LOG(GNUNET_ERROR_TYPE_DEBUG, "[P] Setting value in [%s : %s] to `%.2f'\n", + glp_get_row_name(p->prob, row), glp_get_col_name(p->prob, col), + val); + glp_set_mat_row(p->prob, row, c_elems + 1, ind_array, val_array); + GNUNET_free(ind_array); + GNUNET_free(val_array); + return GNUNET_YES; + } else - { - /* Update value */ - LOG (GNUNET_ERROR_TYPE_DEBUG, "[P] Updating value in [%s : %s] from `%.2f' to `%.2f'\n", - glp_get_row_name (p->prob, row), glp_get_col_name (p->prob, col), - val_array[c1], val); - if (val != val_array[c1]) - res = GNUNET_YES; - else - res = GNUNET_NO; - val_array[c1] = val; - /* Update the row in the matrix */ - glp_set_mat_row (p->prob, row, c_elems, ind_array, val_array); - } - - GNUNET_free (ind_array); - GNUNET_free (val_array); + { + /* Update value */ + LOG(GNUNET_ERROR_TYPE_DEBUG, "[P] Updating value in [%s : %s] from `%.2f' to `%.2f'\n", + glp_get_row_name(p->prob, row), glp_get_col_name(p->prob, col), + val_array[c1], val); + if (val != val_array[c1]) + res = GNUNET_YES; + else + res = GNUNET_NO; + val_array[c1] = val; + /* Update the row in the matrix */ + glp_set_mat_row(p->prob, row, c_elems, ind_array, val_array); + } + + GNUNET_free(ind_array); + GNUNET_free(val_array); return res; } @@ -854,83 +874,89 @@ mlp_create_problem_update_value (struct MLP_Problem *p, * @param line calling line for debbuging */ static void -mlp_create_problem_set_value (struct MLP_Problem *p, - int row, int col, double val, - int line) +mlp_create_problem_set_value(struct MLP_Problem *p, + int row, int col, double val, + int line) { if ((p->ci) >= p->num_elements) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: line %u: Request for index %u bigger than array size of %u\n", - line, p->ci + 1, p->num_elements); - GNUNET_break (0); - return; - } + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "[P]: line %u: Request for index %u bigger than array size of %u\n", + line, p->ci + 1, p->num_elements); + GNUNET_break(0); + return; + } if ((0 == row) || (0 == col)) - { - GNUNET_break (0); - LOG (GNUNET_ERROR_TYPE_ERROR, "[P]: Invalid call from line %u: row = %u, col = %u\n", - line, row, col); - } - p->ia[p->ci] = row ; + { + GNUNET_break(0); + LOG(GNUNET_ERROR_TYPE_ERROR, "[P]: Invalid call from line %u: row = %u, col = %u\n", + line, row, col); + } + p->ia[p->ci] = row; p->ja[p->ci] = col; p->ar[p->ci] = val; #if DEBUG_MLP_PROBLEM_CREATION - LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: line %u: Set value [%u,%u] in index %u == %.2f\n", + LOG(GNUNET_ERROR_TYPE_DEBUG, "[P]: line %u: Set value [%u,%u] in index %u == %.2f\n", line, p->ia[p->ci], p->ja[p->ci], p->ci, p->ar[p->ci]); #endif p->ci++; } static int -mlp_create_problem_create_column (struct MLP_Problem *p, char *name, - unsigned int type, unsigned int bound, double lb, double ub, - double coef) +mlp_create_problem_create_column(struct MLP_Problem *p, char *name, + unsigned int type, unsigned int bound, double lb, double ub, + double coef) { - int col = glp_add_cols (p->prob, 1); - glp_set_col_name (p->prob, col, name); - glp_set_col_bnds (p->prob, col, bound, lb, ub); - glp_set_col_kind (p->prob, col, type); - glp_set_obj_coef (p->prob, col, coef); + int col = glp_add_cols(p->prob, 1); + + glp_set_col_name(p->prob, col, name); + glp_set_col_bnds(p->prob, col, bound, lb, ub); + glp_set_col_kind(p->prob, col, type); + glp_set_obj_coef(p->prob, col, coef); #if DEBUG_MLP_PROBLEM_CREATION - LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added column [%u] `%s': %.2f\n", + LOG(GNUNET_ERROR_TYPE_DEBUG, "[P]: Added column [%u] `%s': %.2f\n", col, name, coef); #endif return col; } static int -mlp_create_problem_create_constraint (struct MLP_Problem *p, char *name, - unsigned int bound, double lb, double ub) +mlp_create_problem_create_constraint(struct MLP_Problem *p, char *name, + unsigned int bound, double lb, double ub) { char * op; - int row = glp_add_rows (p->prob, 1); + int row = glp_add_rows(p->prob, 1); + /* set row name */ - glp_set_row_name (p->prob, row, name); + glp_set_row_name(p->prob, row, name); /* set row bounds: <= 0 */ - glp_set_row_bnds (p->prob, row, bound, lb, ub); + glp_set_row_bnds(p->prob, row, bound, lb, ub); switch (bound) - { + { case GLP_UP: - GNUNET_asprintf(&op, "-inf <= x <= %.2f", ub); - break; + GNUNET_asprintf(&op, "-inf <= x <= %.2f", ub); + break; + case GLP_DB: - GNUNET_asprintf(&op, "%.2f <= x <= %.2f", lb, ub); - break; + GNUNET_asprintf(&op, "%.2f <= x <= %.2f", lb, ub); + break; + case GLP_FX: - GNUNET_asprintf(&op, "%.2f == x == %.2f", lb, ub); - break; + GNUNET_asprintf(&op, "%.2f == x == %.2f", lb, ub); + break; + case GLP_LO: - GNUNET_asprintf(&op, "%.2f <= x <= inf", lb); - break; + GNUNET_asprintf(&op, "%.2f <= x <= inf", lb); + break; + default: - GNUNET_asprintf(&op, "ERROR"); - break; - } + GNUNET_asprintf(&op, "ERROR"); + break; + } #if DEBUG_MLP_PROBLEM_CREATION - LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s\n", - row, name, op); + LOG(GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s\n", + row, name, op); #endif - GNUNET_free (op); + GNUNET_free(op); return row; } @@ -942,9 +968,9 @@ mlp_create_problem_create_constraint (struct MLP_Problem *p, char *name, * - Set address dependent entries in problem matrix as well */ static int -mlp_create_problem_add_address_information (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) +mlp_create_problem_add_address_information(void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) { struct GAS_MLP_Handle *mlp = cls; struct MLP_Problem *p = &mlp->p; @@ -964,63 +990,63 @@ mlp_create_problem_add_address_information (void *cls, mlpi = address->solver_information; if (NULL == mlpi) - { - fprintf (stderr, "%s %p\n",GNUNET_i2s (&address->peer), address); - GNUNET_break (0); + { + fprintf(stderr, "%s %p\n", GNUNET_i2s(&address->peer), address); + GNUNET_break(0); return GNUNET_OK; - } + } addr_net = address->properties.scope; for (addr_net_index = 0; addr_net_index < GNUNET_NT_COUNT; addr_net_index++) - { - if (mlp->pv.quota_index[addr_net_index] == addr_net) - break; - } + { + if (mlp->pv.quota_index[addr_net_index] == addr_net) + break; + } if (addr_net_index >= GNUNET_NT_COUNT) - { - GNUNET_break (0); - return GNUNET_OK; - } + { + GNUNET_break(0); + return GNUNET_OK; + } max_quota = 0; for (c = 0; c < GNUNET_NT_COUNT; c++) - { - if (mlp->pv.quota_out[c] > max_quota) - max_quota = mlp->pv.quota_out[c]; - if (mlp->pv.quota_in[c] > max_quota) - max_quota = mlp->pv.quota_in[c]; - } + { + if (mlp->pv.quota_out[c] > max_quota) + max_quota = mlp->pv.quota_out[c]; + if (mlp->pv.quota_in[c] > max_quota) + max_quota = mlp->pv.quota_in[c]; + } if (max_quota > mlp->pv.BIG_M) - cur_bigm = (double) mlp->pv.BIG_M; + cur_bigm = (double)mlp->pv.BIG_M; else cur_bigm = max_quota; /* Get peer */ - peer = GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, key); - GNUNET_assert (NULL != peer); + peer = GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, key); + GNUNET_assert(NULL != peer); if (peer->processed == GNUNET_NO) - { + { /* Add peer dependent constraints */ /* Add c2) One address active per peer */ GNUNET_asprintf(&name, "c2_%s", GNUNET_i2s(&address->peer)); - peer->r_c2 = mlp_create_problem_create_constraint (p, name, GLP_FX, 1.0, 1.0); - GNUNET_free (name); + peer->r_c2 = mlp_create_problem_create_constraint(p, name, GLP_FX, 1.0, 1.0); + GNUNET_free(name); if (GNUNET_NO == mlp->opt_dbg_feasibility_only) - { - if (GNUNET_YES == mlp->opt_dbg_optimize_relativity) { - /* Add c9) Relativity */ - GNUNET_asprintf(&name, "c9_%s", GNUNET_i2s(&address->peer)); - peer->r_c9 = mlp_create_problem_create_constraint (p, name, GLP_LO, 0.0, 0.0); - GNUNET_free (name); - /* c9) set coefficient */ - mlp_create_problem_set_value (p, peer->r_c9, p->c_r, -peer->f , __LINE__); + if (GNUNET_YES == mlp->opt_dbg_optimize_relativity) + { + /* Add c9) Relativity */ + GNUNET_asprintf(&name, "c9_%s", GNUNET_i2s(&address->peer)); + peer->r_c9 = mlp_create_problem_create_constraint(p, name, GLP_LO, 0.0, 0.0); + GNUNET_free(name); + /* c9) set coefficient */ + mlp_create_problem_set_value(p, peer->r_c9, p->c_r, -peer->f, __LINE__); + } } - } peer->processed = GNUNET_YES; - } + } /* Reset addresses' solver information */ mlpi->c_b = 0; @@ -1030,47 +1056,47 @@ mlp_create_problem_add_address_information (void *cls, mlpi->r_c3 = 0; /* Add bandwidth column */ - GNUNET_asprintf (&name, "b_%s_%s_%p", GNUNET_i2s (&address->peer), address->plugin, address); + GNUNET_asprintf(&name, "b_%s_%s_%p", GNUNET_i2s(&address->peer), address->plugin, address); if (GNUNET_NO == mlp->opt_dbg_feasibility_only) - { - mlpi->c_b = mlp_create_problem_create_column (p, name, GLP_CV, GLP_LO, 0.0, 0.0, 0.0); - } + { + mlpi->c_b = mlp_create_problem_create_column(p, name, GLP_CV, GLP_LO, 0.0, 0.0, 0.0); + } else - { - /* Maximize for bandwidth assignment in feasibility testing */ - mlpi->c_b = mlp_create_problem_create_column (p, name, GLP_CV, GLP_LO, 0.0, 0.0, 1.0); - } - GNUNET_free (name); + { + /* Maximize for bandwidth assignment in feasibility testing */ + mlpi->c_b = mlp_create_problem_create_column(p, name, GLP_CV, GLP_LO, 0.0, 0.0, 1.0); + } + GNUNET_free(name); /* Add address active column */ - GNUNET_asprintf (&name, "n_%s_%s_%p", GNUNET_i2s (&address->peer), address->plugin, address); - mlpi->c_n = mlp_create_problem_create_column (p, name, GLP_IV, GLP_DB, 0.0, 1.0, 0.0); - GNUNET_free (name); + GNUNET_asprintf(&name, "n_%s_%s_%p", GNUNET_i2s(&address->peer), address->plugin, address); + mlpi->c_n = mlp_create_problem_create_column(p, name, GLP_IV, GLP_DB, 0.0, 1.0, 0.0); + GNUNET_free(name); /* Add address dependent constraints */ /* Add c1) bandwidth capping: b_t + (-M) * n_t <= 0 */ GNUNET_asprintf(&name, "c1_%s_%s_%p", GNUNET_i2s(&address->peer), address->plugin, address); - mlpi->r_c1 = mlp_create_problem_create_constraint (p, name, GLP_UP, 0.0, 0.0); - GNUNET_free (name); + mlpi->r_c1 = mlp_create_problem_create_constraint(p, name, GLP_UP, 0.0, 0.0); + GNUNET_free(name); /* c1) set b = 1 coefficient */ - mlp_create_problem_set_value (p, mlpi->r_c1, mlpi->c_b, 1, __LINE__); + mlp_create_problem_set_value(p, mlpi->r_c1, mlpi->c_b, 1, __LINE__); /* c1) set n = - min (M, quota) coefficient */ - cur_bigm = (double) mlp->pv.quota_out[addr_net_index]; + cur_bigm = (double)mlp->pv.quota_out[addr_net_index]; if (cur_bigm > mlp->pv.BIG_M) - cur_bigm = (double) mlp->pv.BIG_M; - mlp_create_problem_set_value (p, mlpi->r_c1, mlpi->c_n, -cur_bigm, __LINE__); + cur_bigm = (double)mlp->pv.BIG_M; + mlp_create_problem_set_value(p, mlpi->r_c1, mlpi->c_n, -cur_bigm, __LINE__); /* Add constraint c 3) minimum bandwidth * b_t + (-n_t * b_min) >= 0 * */ GNUNET_asprintf(&name, "c3_%s_%s_%p", GNUNET_i2s(&address->peer), address->plugin, address); - mlpi->r_c3 = mlp_create_problem_create_constraint (p, name, GLP_LO, 0.0, 0.0); - GNUNET_free (name); + mlpi->r_c3 = mlp_create_problem_create_constraint(p, name, GLP_LO, 0.0, 0.0); + GNUNET_free(name); /* c3) set b = 1 coefficient */ - mlp_create_problem_set_value (p, mlpi->r_c3, mlpi->c_b, 1, __LINE__); + mlp_create_problem_set_value(p, mlpi->r_c3, mlpi->c_b, 1, __LINE__); /* c3) set n = -b_min coefficient */ - mlp_create_problem_set_value (p, mlpi->r_c3, mlpi->c_n, - ((double )mlp->pv.b_min), __LINE__); + mlp_create_problem_set_value(p, mlpi->r_c3, mlpi->c_n, -((double )mlp->pv.b_min), __LINE__); /* Set coefficient entries in invariant rows */ @@ -1078,41 +1104,41 @@ mlp_create_problem_add_address_information (void *cls, /* Feasbility */ /* c 4) minimum connections */ - mlp_create_problem_set_value (p, p->r_c4, mlpi->c_n, 1, __LINE__); + mlp_create_problem_set_value(p, p->r_c4, mlpi->c_n, 1, __LINE__); /* c 2) 1 address peer peer */ - mlp_create_problem_set_value (p, peer->r_c2, mlpi->c_n, 1, __LINE__); + mlp_create_problem_set_value(p, peer->r_c2, mlpi->c_n, 1, __LINE__); /* c 10) obey network specific quotas * (1)*b_1 + ... + (1)*b_m <= quota_n */ - mlp_create_problem_set_value (p, p->r_quota[addr_net_index], mlpi->c_b, 1, __LINE__); + mlp_create_problem_set_value(p, p->r_quota[addr_net_index], mlpi->c_b, 1, __LINE__); /* Optimality */ if (GNUNET_NO == mlp->opt_dbg_feasibility_only) - { - /* c 6) maximize diversity */ - mlp_create_problem_set_value (p, p->r_c6, mlpi->c_n, 1, __LINE__); - /* c 9) relativity */ - if (GNUNET_YES == mlp->opt_dbg_optimize_relativity) - mlp_create_problem_set_value (p, peer->r_c9, mlpi->c_b, 1, __LINE__); - /* c 8) utility */ - if (GNUNET_YES == mlp->opt_dbg_optimize_utility) - mlp_create_problem_set_value (p, p->r_c8, mlpi->c_b, 1, __LINE__); - /* c 7) Optimize quality */ - /* For all quality metrics, set quality of this address */ - if (GNUNET_YES == mlp->opt_dbg_optimize_quality) - { - mlp_create_problem_set_value (p, - p->r_q[RQ_QUALITY_METRIC_DELAY], - mlpi->c_b, - address->norm_delay.norm, - __LINE__); - mlp_create_problem_set_value (p, - p->r_q[RQ_QUALITY_METRIC_DISTANCE], - mlpi->c_b, - address->norm_distance.norm, - __LINE__); - } - } + { + /* c 6) maximize diversity */ + mlp_create_problem_set_value(p, p->r_c6, mlpi->c_n, 1, __LINE__); + /* c 9) relativity */ + if (GNUNET_YES == mlp->opt_dbg_optimize_relativity) + mlp_create_problem_set_value(p, peer->r_c9, mlpi->c_b, 1, __LINE__); + /* c 8) utility */ + if (GNUNET_YES == mlp->opt_dbg_optimize_utility) + mlp_create_problem_set_value(p, p->r_c8, mlpi->c_b, 1, __LINE__); + /* c 7) Optimize quality */ + /* For all quality metrics, set quality of this address */ + if (GNUNET_YES == mlp->opt_dbg_optimize_quality) + { + mlp_create_problem_set_value(p, + p->r_q[RQ_QUALITY_METRIC_DELAY], + mlpi->c_b, + address->norm_delay.norm, + __LINE__); + mlp_create_problem_set_value(p, + p->r_q[RQ_QUALITY_METRIC_DISTANCE], + mlpi->c_b, + address->norm_distance.norm, + __LINE__); + } + } return GNUNET_OK; } @@ -1122,7 +1148,7 @@ mlp_create_problem_add_address_information (void *cls, * Create the invariant columns c4, c6, c10, c8, c7 */ static void -mlp_create_problem_add_invariant_rows (struct GAS_MLP_Handle *mlp, struct MLP_Problem *p) +mlp_create_problem_add_invariant_rows(struct GAS_MLP_Handle *mlp, struct MLP_Problem *p) { int c; @@ -1130,55 +1156,55 @@ mlp_create_problem_add_invariant_rows (struct GAS_MLP_Handle *mlp, struct MLP_Pr /* Row for c4) minimum connection */ /* Number of minimum connections is min(|Peers|, n_min) */ - p->r_c4 = mlp_create_problem_create_constraint (p, "c4", GLP_LO, (mlp->pv.n_min > p->num_peers) ? p->num_peers : mlp->pv.n_min, 0.0); + p->r_c4 = mlp_create_problem_create_constraint(p, "c4", GLP_LO, (mlp->pv.n_min > p->num_peers) ? p->num_peers : mlp->pv.n_min, 0.0); /* Rows for c 10) Enforce network quotas */ for (c = 0; c < GNUNET_NT_COUNT; c++) - { - char * text; - GNUNET_asprintf(&text, "c10_quota_ats_%s", - GNUNET_NT_to_string(mlp->pv.quota_index[c])); - p->r_quota[c] = mlp_create_problem_create_constraint (p, text, GLP_DB, 0.0, mlp->pv.quota_out[c]); - GNUNET_free (text); - } + { + char * text; + GNUNET_asprintf(&text, "c10_quota_ats_%s", + GNUNET_NT_to_string(mlp->pv.quota_index[c])); + p->r_quota[c] = mlp_create_problem_create_constraint(p, text, GLP_DB, 0.0, mlp->pv.quota_out[c]); + GNUNET_free(text); + } /* Optimality */ if (GNUNET_NO == mlp->opt_dbg_feasibility_only) - { - char *name; - /* Add row for c6) Maximize for diversity */ - if (GNUNET_YES == mlp->opt_dbg_optimize_diversity) { - p->r_c6 = mlp_create_problem_create_constraint (p, "c6", GLP_FX, 0.0, 0.0); - /* Set c6 ) Setting -D */ - mlp_create_problem_set_value (p, p->r_c6, p->c_d, -1, __LINE__); - } + char *name; + /* Add row for c6) Maximize for diversity */ + if (GNUNET_YES == mlp->opt_dbg_optimize_diversity) + { + p->r_c6 = mlp_create_problem_create_constraint(p, "c6", GLP_FX, 0.0, 0.0); + /* Set c6 ) Setting -D */ + mlp_create_problem_set_value(p, p->r_c6, p->c_d, -1, __LINE__); + } - /* Adding rows for c 8) Maximize utility */ - if (GNUNET_YES == mlp->opt_dbg_optimize_utility) - { - p->r_c8 = mlp_create_problem_create_constraint (p, "c8", GLP_FX, 0.0, 0.0); - /* -u */ - mlp_create_problem_set_value (p, p->r_c8, p->c_u, -1, __LINE__); - } + /* Adding rows for c 8) Maximize utility */ + if (GNUNET_YES == mlp->opt_dbg_optimize_utility) + { + p->r_c8 = mlp_create_problem_create_constraint(p, "c8", GLP_FX, 0.0, 0.0); + /* -u */ + mlp_create_problem_set_value(p, p->r_c8, p->c_u, -1, __LINE__); + } - /* For all quality metrics: - * c 7) Maximize quality, austerity */ - if (GNUNET_YES == mlp->opt_dbg_optimize_quality) - { - for (c = 0; c < mlp->pv.m_q; c++) - { - GNUNET_asprintf (&name, - "c7_q%i_%s", c, - print_quality_type (c)); - p->r_q[c] = mlp_create_problem_create_constraint (p, name, GLP_FX, 0.0, 0.0); - GNUNET_free (name); - mlp_create_problem_set_value (p, - p->r_q[c], - p->c_q[c], -1, __LINE__); - } + /* For all quality metrics: + * c 7) Maximize quality, austerity */ + if (GNUNET_YES == mlp->opt_dbg_optimize_quality) + { + for (c = 0; c < mlp->pv.m_q; c++) + { + GNUNET_asprintf(&name, + "c7_q%i_%s", c, + print_quality_type(c)); + p->r_q[c] = mlp_create_problem_create_constraint(p, name, GLP_FX, 0.0, 0.0); + GNUNET_free(name); + mlp_create_problem_set_value(p, + p->r_q[c], + p->c_q[c], -1, __LINE__); + } + } } - } } @@ -1186,36 +1212,36 @@ mlp_create_problem_add_invariant_rows (struct GAS_MLP_Handle *mlp, struct MLP_Pr * Create the invariant columns d, u, r, q0 ... qm */ static void -mlp_create_problem_add_invariant_columns (struct GAS_MLP_Handle *mlp, struct MLP_Problem *p) +mlp_create_problem_add_invariant_columns(struct GAS_MLP_Handle *mlp, struct MLP_Problem *p) { if (GNUNET_NO == mlp->opt_dbg_feasibility_only) - { - char *name; - int c; + { + char *name; + int c; - /* Diversity d column */ - if (GNUNET_YES == mlp->opt_dbg_optimize_diversity) - p->c_d = mlp_create_problem_create_column (p, "d", GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_D); + /* Diversity d column */ + if (GNUNET_YES == mlp->opt_dbg_optimize_diversity) + p->c_d = mlp_create_problem_create_column(p, "d", GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_D); - /* Utilization u column */ - if (GNUNET_YES == mlp->opt_dbg_optimize_utility) - p->c_u = mlp_create_problem_create_column (p, "u", GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_U); + /* Utilization u column */ + if (GNUNET_YES == mlp->opt_dbg_optimize_utility) + p->c_u = mlp_create_problem_create_column(p, "u", GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_U); - /* Relativity r column */ - if (GNUNET_YES == mlp->opt_dbg_optimize_relativity) - p->c_r = mlp_create_problem_create_column (p, "r", GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_R); + /* Relativity r column */ + if (GNUNET_YES == mlp->opt_dbg_optimize_relativity) + p->c_r = mlp_create_problem_create_column(p, "r", GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_R); - /* Quality metric columns */ - if (GNUNET_YES == mlp->opt_dbg_optimize_quality) - { - for (c = 0; c < mlp->pv.m_q; c++) - { - GNUNET_asprintf (&name, "q_%u", c); - p->c_q[c] = mlp_create_problem_create_column (p, name, GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_Q[c]); - GNUNET_free (name); - } + /* Quality metric columns */ + if (GNUNET_YES == mlp->opt_dbg_optimize_quality) + { + for (c = 0; c < mlp->pv.m_q; c++) + { + GNUNET_asprintf(&name, "q_%u", c); + p->c_q[c] = mlp_create_problem_create_column(p, name, GLP_CV, GLP_LO, 0.0, 0.0, mlp->pv.co_Q[c]); + GNUNET_free(name); + } + } } - } } @@ -1226,73 +1252,73 @@ mlp_create_problem_add_invariant_columns (struct GAS_MLP_Handle *mlp, struct MLP * @return #GNUNET_OK or #GNUNET_SYSERR */ static int -mlp_create_problem (struct GAS_MLP_Handle *mlp) +mlp_create_problem(struct GAS_MLP_Handle *mlp) { struct MLP_Problem *p = &mlp->p; int res = GNUNET_OK; - GNUNET_assert (p->prob == NULL); - GNUNET_assert (p->ia == NULL); - GNUNET_assert (p->ja == NULL); - GNUNET_assert (p->ar == NULL); + GNUNET_assert(p->prob == NULL); + GNUNET_assert(p->ia == NULL); + GNUNET_assert(p->ja == NULL); + GNUNET_assert(p->ar == NULL); /* Reset MLP problem struct */ /* create the glpk problem */ - p->prob = glp_create_prob (); - GNUNET_assert (NULL != p->prob); - p->num_peers = mlp_create_problem_count_peers (mlp->requested_peers, mlp->env->addresses); - p->num_addresses = mlp_create_problem_count_addresses (mlp->requested_peers, - mlp->env->addresses); + p->prob = glp_create_prob(); + GNUNET_assert(NULL != p->prob); + p->num_peers = mlp_create_problem_count_peers(mlp->requested_peers, mlp->env->addresses); + p->num_addresses = mlp_create_problem_count_addresses(mlp->requested_peers, + mlp->env->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); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Rebuilding problem for %u peer(s) and %u addresse(s) and %u quality metrics == %u elements\n", - p->num_peers, - p->num_addresses, - mlp->pv.m_q, - p->num_elements); + mlp->pv.m_q + p->num_peers + 2 + 1); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Rebuilding problem for %u peer(s) and %u addresse(s) and %u quality metrics == %u elements\n", + p->num_peers, + p->num_addresses, + mlp->pv.m_q, + p->num_elements); /* Set a problem name */ - glp_set_prob_name (p->prob, "GNUnet ATS bandwidth distribution"); + glp_set_prob_name(p->prob, "GNUnet ATS bandwidth distribution"); /* Set optimization direction to maximize */ - glp_set_obj_dir (p->prob, GLP_MAX); + glp_set_obj_dir(p->prob, GLP_MAX); /* Create problem matrix */ /* last +1 caused by glpk index starting with one: [1..elements]*/ p->ci = 1; /* row index */ - p->ia = GNUNET_malloc (p->num_elements * sizeof (int)); + p->ia = GNUNET_malloc(p->num_elements * sizeof(int)); /* column index */ - p->ja = GNUNET_malloc (p->num_elements * sizeof (int)); + p->ja = GNUNET_malloc(p->num_elements * sizeof(int)); /* coefficient */ - p->ar = GNUNET_malloc (p->num_elements * sizeof (double)); + p->ar = GNUNET_malloc(p->num_elements * sizeof(double)); if ((NULL == p->ia) || (NULL == p->ja) || (NULL == p->ar)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Problem size too large, cannot allocate memory!\n")); + { + LOG(GNUNET_ERROR_TYPE_ERROR, _("Problem size too large, cannot allocate memory!\n")); return GNUNET_SYSERR; - } + } /* Adding invariant columns */ - mlp_create_problem_add_invariant_columns (mlp, p); + mlp_create_problem_add_invariant_columns(mlp, p); /* Adding address independent constraint rows */ - mlp_create_problem_add_invariant_rows (mlp, p); + mlp_create_problem_add_invariant_rows(mlp, p); /* Adding address dependent columns constraint rows */ - GNUNET_CONTAINER_multipeermap_iterate (mlp->env->addresses, - &mlp_create_problem_add_address_information, - mlp); + GNUNET_CONTAINER_multipeermap_iterate(mlp->env->addresses, + &mlp_create_problem_add_address_information, + mlp); /* Load the matrix */ - LOG (GNUNET_ERROR_TYPE_DEBUG, "Loading matrix\n"); - glp_load_matrix(p->prob, (p->ci)-1, p->ia, p->ja, p->ar); + LOG(GNUNET_ERROR_TYPE_DEBUG, "Loading matrix\n"); + glp_load_matrix(p->prob, (p->ci) - 1, p->ia, p->ja, p->ar); if (GNUNET_YES == mlp->opt_dbg_autoscale_problem) - { - glp_scale_prob (p->prob, GLP_SF_AUTO); - } + { + glp_scale_prob(p->prob, GLP_SF_AUTO); + } return res; } @@ -1305,34 +1331,37 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp) * @return #GNUNET_OK if could be solved, #GNUNET_SYSERR on failure */ static int -mlp_solve_lp_problem (struct GAS_MLP_Handle *mlp) +mlp_solve_lp_problem(struct GAS_MLP_Handle *mlp) { int res = 0; int res_status = 0; + res = glp_simplex(mlp->p.prob, &mlp->control_param_lp); if (0 == res) LOG(GNUNET_ERROR_TYPE_DEBUG, "Solving LP problem: %s\n", - mlp_solve_to_string (res)); + mlp_solve_to_string(res)); else LOG(GNUNET_ERROR_TYPE_DEBUG, "Solving LP problem failed: %s\n", - mlp_solve_to_string (res)); + mlp_solve_to_string(res)); /* Analyze problem status */ - res_status = glp_get_status (mlp->p.prob); - switch (res_status) { + res_status = glp_get_status(mlp->p.prob); + switch (res_status) + { case GLP_OPT: /* solution is optimal */ - LOG (GNUNET_ERROR_TYPE_INFO, + LOG(GNUNET_ERROR_TYPE_INFO, "Solving LP problem: %s, %s\n", mlp_solve_to_string(res), mlp_status_to_string(res_status)); return GNUNET_OK; + default: - LOG (GNUNET_ERROR_TYPE_ERROR, + LOG(GNUNET_ERROR_TYPE_ERROR, "Solving LP problem failed: %s %s\n", mlp_solve_to_string(res), mlp_status_to_string(res_status)); return GNUNET_SYSERR; - } + } } @@ -1345,9 +1374,9 @@ mlp_solve_lp_problem (struct GAS_MLP_Handle *mlp) * @return #GNUNET_OK to continue */ static int -mlp_propagate_results (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) +mlp_propagate_results(void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) { struct GAS_MLP_Handle *mlp = cls; struct ATS_Address *address; @@ -1357,27 +1386,27 @@ mlp_propagate_results (void *cls, double mlp_use = MLP_NaN; /* Check if we have to add this peer due to a pending request */ - if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (mlp->requested_peers, - key)) - { - return GNUNET_OK; - } + if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains(mlp->requested_peers, + key)) + { + return GNUNET_OK; + } address = value; - GNUNET_assert (address->solver_information != NULL); + GNUNET_assert(address->solver_information != NULL); mlpi = address->solver_information; mlp_bw_in = glp_mip_col_val(mlp->p.prob, mlpi->c_b);/* FIXME */ - if (mlp_bw_in > (double) UINT32_MAX) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, "Overflow in assigned bandwidth, reducing ...\n" ); - mlp_bw_in = (double) UINT32_MAX; - } + if (mlp_bw_in > (double)UINT32_MAX) + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "Overflow in assigned bandwidth, reducing ...\n"); + mlp_bw_in = (double)UINT32_MAX; + } mlp_bw_out = glp_mip_col_val(mlp->p.prob, mlpi->c_b); - if (mlp_bw_out > (double) UINT32_MAX) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, "Overflow in assigned bandwidth, reducing ...\n" ); - mlp_bw_out = (double) UINT32_MAX; - } + if (mlp_bw_out > (double)UINT32_MAX) + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "Overflow in assigned bandwidth, reducing ...\n"); + mlp_bw_out = (double)UINT32_MAX; + } mlp_use = glp_mip_col_val(mlp->p.prob, mlpi->c_n); /* @@ -1388,147 +1417,154 @@ mlp_propagate_results (void *cls, */ if (GLP_YES == mlp_use) - { - /* This address was selected by the solver to be used */ - mlpi->n = GNUNET_YES; - if (GNUNET_NO == address->active) - { - /* Address was not used before, enabling address */ - LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : enabling address\n", - (1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out); - address->active = GNUNET_YES; - address->assigned_bw_in = mlp_bw_in; - mlpi->b_in = mlp_bw_in; - address->assigned_bw_out = mlp_bw_out; - mlpi->b_out = mlp_bw_out; - if ((NULL == mlp->exclude_peer) || (0 != GNUNET_memcmp (&address->peer, mlp->exclude_peer))) - mlp->env->bandwidth_changed_cb (mlp->env->cls, address); - return GNUNET_OK; - } - else if (GNUNET_YES == address->active) { - /* Address was used before, check for bandwidth change */ - if ((mlp_bw_out != address->assigned_bw_out) || - (mlp_bw_in != address->assigned_bw_in)) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : bandwidth changed\n", - (1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out); + /* This address was selected by the solver to be used */ + mlpi->n = GNUNET_YES; + if (GNUNET_NO == address->active) + { + /* Address was not used before, enabling address */ + LOG(GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : enabling address\n", + (1 == mlp_use) ? "[x]" : "[ ]", mlp_bw_out); + address->active = GNUNET_YES; address->assigned_bw_in = mlp_bw_in; mlpi->b_in = mlp_bw_in; address->assigned_bw_out = mlp_bw_out; mlpi->b_out = mlp_bw_out; - if ((NULL == mlp->exclude_peer) || (0 != GNUNET_memcmp (&address->peer, mlp->exclude_peer))) - mlp->env->bandwidth_changed_cb (mlp->env->cls, address); + if ((NULL == mlp->exclude_peer) || (0 != GNUNET_memcmp(&address->peer, mlp->exclude_peer))) + mlp->env->bandwidth_changed_cb(mlp->env->cls, address); return GNUNET_OK; - } + } + else if (GNUNET_YES == address->active) + { + /* Address was used before, check for bandwidth change */ + if ((mlp_bw_out != address->assigned_bw_out) || + (mlp_bw_in != address->assigned_bw_in)) + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : bandwidth changed\n", + (1 == mlp_use) ? "[x]" : "[ ]", mlp_bw_out); + address->assigned_bw_in = mlp_bw_in; + mlpi->b_in = mlp_bw_in; + address->assigned_bw_out = mlp_bw_out; + mlpi->b_out = mlp_bw_out; + if ((NULL == mlp->exclude_peer) || (0 != GNUNET_memcmp(&address->peer, mlp->exclude_peer))) + mlp->env->bandwidth_changed_cb(mlp->env->cls, address); + return GNUNET_OK; + } + } + else + GNUNET_break(0); } - else - GNUNET_break (0); - } else if (GLP_NO == mlp_use) - { - /* This address was selected by the solver to be not used */ - mlpi->n = GNUNET_NO; - if (GNUNET_NO == address->active) - { - /* Address was not used before, nothing to do */ - LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : no change\n", - (1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out); - return GNUNET_OK; - } - else if (GNUNET_YES == address->active) - { - /* Address was used before, disabling address */ - LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : disabling address\n", - (1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out); - address->active = GNUNET_NO; - /* Set bandwidth to 0 */ - address->assigned_bw_in = 0; - mlpi->b_in = 0; - address->assigned_bw_out = 0; - mlpi->b_out = 0; - return GNUNET_OK; + { + /* This address was selected by the solver to be not used */ + mlpi->n = GNUNET_NO; + if (GNUNET_NO == address->active) + { + /* Address was not used before, nothing to do */ + LOG(GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : no change\n", + (1 == mlp_use) ? "[x]" : "[ ]", mlp_bw_out); + return GNUNET_OK; + } + else if (GNUNET_YES == address->active) + { + /* Address was used before, disabling address */ + LOG(GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : disabling address\n", + (1 == mlp_use) ? "[x]" : "[ ]", mlp_bw_out); + address->active = GNUNET_NO; + /* Set bandwidth to 0 */ + address->assigned_bw_in = 0; + mlpi->b_in = 0; + address->assigned_bw_out = 0; + mlpi->b_out = 0; + return GNUNET_OK; + } + else + GNUNET_break(0); } - else - GNUNET_break (0); - } else - GNUNET_break (0); + GNUNET_break(0); return GNUNET_OK; } static void -notify (struct GAS_MLP_Handle *mlp, - enum GAS_Solver_Operation op, - enum GAS_Solver_Status stat, - enum GAS_Solver_Additional_Information add) +notify(struct GAS_MLP_Handle *mlp, + enum GAS_Solver_Operation op, + enum GAS_Solver_Status stat, + enum GAS_Solver_Additional_Information add) { - mlp->env->info_cb (mlp->env->cls, - op, - stat, - add); + mlp->env->info_cb(mlp->env->cls, + op, + stat, + add); } static void -mlp_branch_and_cut_cb (glp_tree *tree, void *info) +mlp_branch_and_cut_cb(glp_tree *tree, void *info) { struct GAS_MLP_Handle *mlp = info; double mlp_obj = 0; - switch (glp_ios_reason (tree)) - { + switch (glp_ios_reason(tree)) + { case GLP_ISELECT: - /* Do nothing here */ + /* Do nothing here */ break; + case GLP_IPREPRO: - /* Do nothing here */ + /* Do nothing here */ break; + case GLP_IROWGEN: - /* Do nothing here */ + /* Do nothing here */ break; + case GLP_IHEUR: - /* Do nothing here */ + /* Do nothing here */ break; + case GLP_ICUTGEN: - /* Do nothing here */ + /* Do nothing here */ break; + case GLP_IBRANCH: - /* Do nothing here */ + /* Do nothing here */ break; + case GLP_IBINGO: - /* A better solution was found */ - mlp->ps.mlp_gap = glp_ios_mip_gap (tree); - mlp_obj = glp_mip_obj_val (mlp->p.prob); + /* A better solution was found */ + mlp->ps.mlp_gap = glp_ios_mip_gap(tree); + mlp_obj = glp_mip_obj_val(mlp->p.prob); mlp->ps.lp_mlp_gap = (abs(mlp_obj - mlp->ps.lp_objective_value)) / (abs(mlp_obj) + DBL_EPSILON); - LOG (GNUNET_ERROR_TYPE_INFO, + LOG(GNUNET_ERROR_TYPE_INFO, "Found better integer solution, current gaps: %.3f <= %.3f, %.3f <= %.3f\n", mlp->ps.mlp_gap, mlp->pv.mip_gap, mlp->ps.lp_mlp_gap, mlp->pv.lp_mip_gap); if (mlp->ps.mlp_gap <= mlp->pv.mip_gap) - { - LOG (GNUNET_ERROR_TYPE_INFO, - "Current LP/MLP gap of %.3f smaller than tolerated gap of %.3f, terminating search\n", - mlp->ps.lp_mlp_gap, mlp->pv.lp_mip_gap); - glp_ios_terminate (tree); - } + { + LOG(GNUNET_ERROR_TYPE_INFO, + "Current LP/MLP gap of %.3f smaller than tolerated gap of %.3f, terminating search\n", + mlp->ps.lp_mlp_gap, mlp->pv.lp_mip_gap); + glp_ios_terminate(tree); + } if (mlp->ps.lp_mlp_gap <= mlp->pv.lp_mip_gap) - { - LOG (GNUNET_ERROR_TYPE_INFO, - "Current LP/MLP gap of %.3f smaller than tolerated gap of %.3f, terminating search\n", - mlp->ps.lp_mlp_gap, mlp->pv.lp_mip_gap); - glp_ios_terminate (tree); - } + { + LOG(GNUNET_ERROR_TYPE_INFO, + "Current LP/MLP gap of %.3f smaller than tolerated gap of %.3f, terminating search\n", + mlp->ps.lp_mlp_gap, mlp->pv.lp_mip_gap); + glp_ios_terminate(tree); + } break; + default: break; - } + } //GNUNET_break (0); } @@ -1540,7 +1576,7 @@ mlp_branch_and_cut_cb (glp_tree *tree, void *info) * @return #GNUNET_OK if could be solved, #GNUNET_SYSERR on failure */ static int -GAS_mlp_solve_problem (void *solver) +GAS_mlp_solve_problem(void *solver) { struct GAS_MLP_Handle *mlp = solver; char *filename; @@ -1556,7 +1592,7 @@ GAS_mlp_solve_problem (void *solver) struct GNUNET_TIME_Relative dur_mlp; GNUNET_assert(NULL != solver); - dur_lp = GNUNET_TIME_UNIT_ZERO; + dur_lp = GNUNET_TIME_UNIT_ZERO; if (GNUNET_YES == mlp->stat_bulk_lock) { @@ -1564,7 +1600,7 @@ GAS_mlp_solve_problem (void *solver) return GNUNET_NO; } notify(mlp, GAS_OP_SOLVE_START, GAS_STAT_SUCCESS, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); start_total = GNUNET_TIME_absolute_get(); if (0 == GNUNET_CONTAINER_multipeermap_size(mlp->requested_peers)) @@ -1586,32 +1622,32 @@ GAS_mlp_solve_problem (void *solver) return GNUNET_OK; } if (GNUNET_YES == mlp->stat_mlp_prob_changed) - { - LOG(GNUNET_ERROR_TYPE_DEBUG, "Problem size changed, rebuilding\n"); - notify(mlp, GAS_OP_SOLVE_SETUP_START, GAS_STAT_SUCCESS, GAS_INFO_FULL); - mlp_delete_problem (mlp); - if (GNUNET_SYSERR == mlp_create_problem (mlp)) - { - notify(mlp, GAS_OP_SOLVE_SETUP_STOP, GAS_STAT_FAIL, GAS_INFO_FULL); - return GNUNET_SYSERR; - } - notify(mlp, GAS_OP_SOLVE_SETUP_STOP, GAS_STAT_SUCCESS, GAS_INFO_FULL); - if (GNUNET_NO == mlp->opt_dbg_intopt_presolver) - { - mlp->control_param_lp.presolve = GLP_YES; /* LP presolver, we need lp solution */ - mlp->control_param_mlp.presolve = GNUNET_NO; /* No presolver, we have LP solution */ - } - else - { - mlp->control_param_lp.presolve = GNUNET_NO; /* LP presolver, we need lp solution */ - mlp->control_param_mlp.presolve = GLP_YES; /* No presolver, we have LP solution */ - dur_lp = GNUNET_TIME_UNIT_ZERO; - } - } + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "Problem size changed, rebuilding\n"); + notify(mlp, GAS_OP_SOLVE_SETUP_START, GAS_STAT_SUCCESS, GAS_INFO_FULL); + mlp_delete_problem(mlp); + if (GNUNET_SYSERR == mlp_create_problem(mlp)) + { + notify(mlp, GAS_OP_SOLVE_SETUP_STOP, GAS_STAT_FAIL, GAS_INFO_FULL); + return GNUNET_SYSERR; + } + notify(mlp, GAS_OP_SOLVE_SETUP_STOP, GAS_STAT_SUCCESS, GAS_INFO_FULL); + if (GNUNET_NO == mlp->opt_dbg_intopt_presolver) + { + mlp->control_param_lp.presolve = GLP_YES; /* LP presolver, we need lp solution */ + mlp->control_param_mlp.presolve = GNUNET_NO; /* No presolver, we have LP solution */ + } + else + { + mlp->control_param_lp.presolve = GNUNET_NO; /* LP presolver, we need lp solution */ + mlp->control_param_mlp.presolve = GLP_YES; /* No presolver, we have LP solution */ + dur_lp = GNUNET_TIME_UNIT_ZERO; + } + } else - { - LOG(GNUNET_ERROR_TYPE_DEBUG, "Problem was updated, resolving\n"); - } + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "Problem was updated, resolving\n"); + } /* Reset solution info */ mlp->ps.lp_objective_value = 0.0; @@ -1619,156 +1655,160 @@ GAS_mlp_solve_problem (void *solver) mlp->ps.mlp_objective_value = 0.0; mlp->ps.lp_mlp_gap = 0.0; - dur_setup = GNUNET_TIME_absolute_get_duration (start_total); + dur_setup = GNUNET_TIME_absolute_get_duration(start_total); /* Run LP solver */ if (GNUNET_NO == mlp->opt_dbg_intopt_presolver) - { - notify(mlp, GAS_OP_SOLVE_MLP_LP_START, GAS_STAT_SUCCESS, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); - LOG(GNUNET_ERROR_TYPE_DEBUG, - "Running LP solver %s\n", - (GLP_YES == mlp->control_param_lp.presolve)? "with presolver": "without presolver"); - start_cur_op = GNUNET_TIME_absolute_get(); - - /* Solve LP */ - /* Only for debugging: - * Always use LP presolver: - * mlp->control_param_lp.presolve = GLP_YES; */ - res_lp = mlp_solve_lp_problem(mlp); - if (GNUNET_OK == res_lp) - { - mlp->ps.lp_objective_value = glp_get_obj_val (mlp->p.prob); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "LP solution was: %.3f\n", - mlp->ps.lp_objective_value); - } - - dur_lp = GNUNET_TIME_absolute_get_duration (start_cur_op); - notify(mlp, GAS_OP_SOLVE_MLP_LP_STOP, - (GNUNET_OK == res_lp) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); - } + { + notify(mlp, GAS_OP_SOLVE_MLP_LP_START, GAS_STAT_SUCCESS, + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Running LP solver %s\n", + (GLP_YES == mlp->control_param_lp.presolve) ? "with presolver" : "without presolver"); + start_cur_op = GNUNET_TIME_absolute_get(); + + /* Solve LP */ + /* Only for debugging: + * Always use LP presolver: + * mlp->control_param_lp.presolve = GLP_YES; */ + res_lp = mlp_solve_lp_problem(mlp); + if (GNUNET_OK == res_lp) + { + mlp->ps.lp_objective_value = glp_get_obj_val(mlp->p.prob); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "LP solution was: %.3f\n", + mlp->ps.lp_objective_value); + } + + dur_lp = GNUNET_TIME_absolute_get_duration(start_cur_op); + notify(mlp, GAS_OP_SOLVE_MLP_LP_STOP, + (GNUNET_OK == res_lp) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + } if (GNUNET_YES == mlp->opt_dbg_intopt_presolver) res_lp = GNUNET_OK; /* Run MLP solver */ if ((GNUNET_OK == res_lp) || (GNUNET_YES == mlp->opt_dbg_intopt_presolver)) - { - LOG(GNUNET_ERROR_TYPE_DEBUG, "Running MLP solver \n"); - notify(mlp, GAS_OP_SOLVE_MLP_MLP_START, GAS_STAT_SUCCESS, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); - start_cur_op = GNUNET_TIME_absolute_get(); + { + LOG(GNUNET_ERROR_TYPE_DEBUG, "Running MLP solver \n"); + notify(mlp, GAS_OP_SOLVE_MLP_MLP_START, GAS_STAT_SUCCESS, + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + start_cur_op = GNUNET_TIME_absolute_get(); - /* Solve MIP */ + /* Solve MIP */ - /* Only for debugging, always use LP presolver */ - if (GNUNET_YES == mlp->opt_dbg_intopt_presolver) - mlp->control_param_mlp.presolve = GNUNET_YES; + /* Only for debugging, always use LP presolver */ + if (GNUNET_YES == mlp->opt_dbg_intopt_presolver) + mlp->control_param_mlp.presolve = GNUNET_YES; - mip_res = glp_intopt (mlp->p.prob, &mlp->control_param_mlp); - switch (mip_res) - { + mip_res = glp_intopt(mlp->p.prob, &mlp->control_param_mlp); + switch (mip_res) + { case 0: /* Successful */ - LOG (GNUNET_ERROR_TYPE_INFO, - "Solving MLP problem: %s\n", - mlp_solve_to_string (mip_res)); + LOG(GNUNET_ERROR_TYPE_INFO, + "Solving MLP problem: %s\n", + mlp_solve_to_string(mip_res)); break; + case GLP_ETMLIM: /* Time limit reached */ case GLP_EMIPGAP: /* MIP gap tolerance limit reached */ case GLP_ESTOP: /* Solver was instructed to stop*/ /* Semi-successful */ - LOG (GNUNET_ERROR_TYPE_INFO, - "Solving MLP problem solution was interupted: %s\n", - mlp_solve_to_string (mip_res)); + LOG(GNUNET_ERROR_TYPE_INFO, + "Solving MLP problem solution was interupted: %s\n", + mlp_solve_to_string(mip_res)); break; + case GLP_EBOUND: case GLP_EROOT: case GLP_ENOPFS: case GLP_ENODFS: case GLP_EFAIL: default: - /* Fail */ - LOG (GNUNET_ERROR_TYPE_INFO, + /* Fail */ + LOG(GNUNET_ERROR_TYPE_INFO, "Solving MLP problem failed: %s\n", - mlp_solve_to_string (mip_res)); - break; - } - - /* Analyze problem status */ - mip_status = glp_mip_status(mlp->p.prob); - switch (mip_status) - { - case GLP_OPT: /* solution is optimal */ - LOG (GNUNET_ERROR_TYPE_WARNING, - "Solution of MLP problem is optimal: %s, %s\n", - mlp_solve_to_string (mip_res), - mlp_status_to_string (mip_status)); - mip_res = GNUNET_OK; - break; - case GLP_FEAS: /* solution is feasible but not proven optimal */ + mlp_solve_to_string(mip_res)); + break; + } - if ( (mlp->ps.mlp_gap <= mlp->pv.mip_gap) || - (mlp->ps.lp_mlp_gap <= mlp->pv.lp_mip_gap) ) + /* Analyze problem status */ + mip_status = glp_mip_status(mlp->p.prob); + switch (mip_status) { - LOG (GNUNET_ERROR_TYPE_INFO, - "Solution of MLP problem is feasible and solution within gap constraints: %s, %s\n", - mlp_solve_to_string (mip_res), - mlp_status_to_string (mip_status)); + case GLP_OPT: /* solution is optimal */ + LOG(GNUNET_ERROR_TYPE_WARNING, + "Solution of MLP problem is optimal: %s, %s\n", + mlp_solve_to_string(mip_res), + mlp_status_to_string(mip_status)); mip_res = GNUNET_OK; - } - else - { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Solution of MLP problem is feasible but solution not within gap constraints: %s, %s\n", - mlp_solve_to_string (mip_res), - mlp_status_to_string (mip_status)); + break; + + case GLP_FEAS: /* solution is feasible but not proven optimal */ + + if ((mlp->ps.mlp_gap <= mlp->pv.mip_gap) || + (mlp->ps.lp_mlp_gap <= mlp->pv.lp_mip_gap)) + { + LOG(GNUNET_ERROR_TYPE_INFO, + "Solution of MLP problem is feasible and solution within gap constraints: %s, %s\n", + mlp_solve_to_string(mip_res), + mlp_status_to_string(mip_status)); + mip_res = GNUNET_OK; + } + else + { + LOG(GNUNET_ERROR_TYPE_WARNING, + "Solution of MLP problem is feasible but solution not within gap constraints: %s, %s\n", + mlp_solve_to_string(mip_res), + mlp_status_to_string(mip_status)); + mip_res = GNUNET_SYSERR; + } + break; + + case GLP_UNDEF: /* Solution undefined */ + case GLP_NOFEAS: /* No feasible solution */ + default: + LOG(GNUNET_ERROR_TYPE_ERROR, + "Solving MLP problem failed: %s %s\n", + mlp_solve_to_string(mip_res), + mlp_status_to_string(mip_status)); mip_res = GNUNET_SYSERR; + break; } - break; - case GLP_UNDEF: /* Solution undefined */ - case GLP_NOFEAS: /* No feasible solution */ - default: - LOG (GNUNET_ERROR_TYPE_ERROR, - "Solving MLP problem failed: %s %s\n", - mlp_solve_to_string (mip_res), - mlp_status_to_string (mip_status)); - mip_res = GNUNET_SYSERR; - break; - } - dur_mlp = GNUNET_TIME_absolute_get_duration (start_cur_op); - dur_total = GNUNET_TIME_absolute_get_duration (start_total); + dur_mlp = GNUNET_TIME_absolute_get_duration(start_cur_op); + dur_total = GNUNET_TIME_absolute_get_duration(start_total); - notify(mlp, GAS_OP_SOLVE_MLP_MLP_STOP, - (GNUNET_OK == mip_res) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); - } + notify(mlp, GAS_OP_SOLVE_MLP_MLP_STOP, + (GNUNET_OK == mip_res) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + } else - { - /* Do not execute mip solver since lp solution is invalid */ - dur_mlp = GNUNET_TIME_UNIT_ZERO; - dur_total = GNUNET_TIME_absolute_get_duration (start_total); + { + /* Do not execute mip solver since lp solution is invalid */ + dur_mlp = GNUNET_TIME_UNIT_ZERO; + dur_total = GNUNET_TIME_absolute_get_duration(start_total); - notify(mlp, GAS_OP_SOLVE_MLP_MLP_STOP, GAS_STAT_FAIL, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); - mip_res = GNUNET_SYSERR; - } + notify(mlp, GAS_OP_SOLVE_MLP_MLP_STOP, GAS_STAT_FAIL, + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + mip_res = GNUNET_SYSERR; + } /* Notify about end */ notify(mlp, GAS_OP_SOLVE_STOP, - ((GNUNET_OK == mip_res) && (GNUNET_OK == mip_res)) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, - (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); + ((GNUNET_OK == mip_res) && (GNUNET_OK == mip_res)) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, + (GNUNET_YES == mlp->stat_mlp_prob_changed) ? GAS_INFO_FULL : GAS_INFO_UPDATED); - LOG (GNUNET_ERROR_TYPE_DEBUG, + LOG(GNUNET_ERROR_TYPE_DEBUG, "Execution time for %s solve: (total/setup/lp/mlp) : %llu %llu %llu %llu\n", (GNUNET_YES == mlp->stat_mlp_prob_changed) ? "full" : "updated", - (unsigned long long) dur_total.rel_value_us, - (unsigned long long) dur_setup.rel_value_us, - (unsigned long long) dur_lp.rel_value_us, - (unsigned long long) dur_mlp.rel_value_us); + (unsigned long long)dur_total.rel_value_us, + (unsigned long long)dur_setup.rel_value_us, + (unsigned long long)dur_lp.rel_value_us, + (unsigned long long)dur_mlp.rel_value_us); /* Save stats */ mlp->ps.lp_res = res_lp; @@ -1780,55 +1820,59 @@ GAS_mlp_solve_problem (void *solver) mlp->ps.p_elements = mlp->p.num_elements; /* Propagate result*/ - notify (mlp, GAS_OP_SOLVE_UPDATE_NOTIFICATION_START, - (GNUNET_OK == res_lp) && (GNUNET_OK == mip_res) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, - GAS_INFO_NONE); + notify(mlp, GAS_OP_SOLVE_UPDATE_NOTIFICATION_START, + (GNUNET_OK == res_lp) && (GNUNET_OK == mip_res) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, + GAS_INFO_NONE); if ((GNUNET_OK == res_lp) && (GNUNET_OK == mip_res)) { GNUNET_CONTAINER_multipeermap_iterate(mlp->env->addresses, - &mlp_propagate_results, mlp); + &mlp_propagate_results, mlp); } - notify (mlp, GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP, - (GNUNET_OK == res_lp) && (GNUNET_OK == mip_res) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, - GAS_INFO_NONE); + notify(mlp, GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP, + (GNUNET_OK == res_lp) && (GNUNET_OK == mip_res) ? GAS_STAT_SUCCESS : GAS_STAT_FAIL, + GAS_INFO_NONE); struct GNUNET_TIME_Absolute time = GNUNET_TIME_absolute_get(); - if ( (GNUNET_YES == mlp->opt_dump_problem_all) || - (mlp->opt_dump_problem_on_fail && ((GNUNET_OK != res_lp) || (GNUNET_OK != mip_res))) ) + if ((GNUNET_YES == mlp->opt_dump_problem_all) || + (mlp->opt_dump_problem_on_fail && ((GNUNET_OK != res_lp) || (GNUNET_OK != mip_res)))) { /* Write problem to disk */ - switch (mlp->opt_log_format) { + switch (mlp->opt_log_format) + { case MLP_CPLEX: GNUNET_asprintf(&filename, "problem_p_%u_a%u_%llu.cplex", mlp->p.num_peers, - mlp->p.num_addresses, time.abs_value_us); - glp_write_lp (mlp->p.prob, NULL, filename); + mlp->p.num_addresses, time.abs_value_us); + glp_write_lp(mlp->p.prob, NULL, filename); break; + case MLP_GLPK: GNUNET_asprintf(&filename, "problem_p_%u_a%u_%llu.glpk", mlp->p.num_peers, - mlp->p.num_addresses, time.abs_value_us); - glp_write_prob (mlp->p.prob, 0, filename); + mlp->p.num_addresses, time.abs_value_us); + glp_write_prob(mlp->p.prob, 0, filename); break; + case MLP_MPS: GNUNET_asprintf(&filename, "problem_p_%u_a%u_%llu.mps", mlp->p.num_peers, - mlp->p.num_addresses, time.abs_value_us); - glp_write_mps (mlp->p.prob, GLP_MPS_FILE, NULL, filename); + mlp->p.num_addresses, time.abs_value_us); + glp_write_mps(mlp->p.prob, GLP_MPS_FILE, NULL, filename); break; + default: break; - } + } LOG(GNUNET_ERROR_TYPE_ERROR, "Dumped problem to file: `%s' \n", filename); GNUNET_free(filename); } - if ( (mlp->opt_dump_solution_all) || - (mlp->opt_dump_solution_on_fail && ((GNUNET_OK != res_lp) || (GNUNET_OK != mip_res))) ) - { - /* Write solution to disk */ - GNUNET_asprintf(&filename, "problem_p_%u_a%u_%llu.sol", mlp->p.num_peers, - mlp->p.num_addresses, time.abs_value_us); - glp_print_mip(mlp->p.prob, filename); - LOG(GNUNET_ERROR_TYPE_ERROR, "Dumped solution to file: `%s' \n", filename); - GNUNET_free(filename); - } + if ((mlp->opt_dump_solution_all) || + (mlp->opt_dump_solution_on_fail && ((GNUNET_OK != res_lp) || (GNUNET_OK != mip_res)))) + { + /* Write solution to disk */ + GNUNET_asprintf(&filename, "problem_p_%u_a%u_%llu.sol", mlp->p.num_peers, + mlp->p.num_addresses, time.abs_value_us); + glp_print_mip(mlp->p.prob, filename); + LOG(GNUNET_ERROR_TYPE_ERROR, "Dumped solution to file: `%s' \n", filename); + GNUNET_free(filename); + } /* Reset change and update marker */ mlp->control_param_lp.presolve = GLP_NO; @@ -1849,46 +1893,46 @@ GAS_mlp_solve_problem (void *solver) * @param network network type of this address */ static void -GAS_mlp_address_add (void *solver, +GAS_mlp_address_add(void *solver, struct ATS_Address *address, uint32_t network) { struct GAS_MLP_Handle *mlp = solver; if (GNUNET_NT_COUNT <= network) - { - GNUNET_break (0); - return; - } + { + GNUNET_break(0); + return; + } if (NULL == address->solver_information) - { - address->solver_information = GNUNET_new (struct MLP_information); - } + { + address->solver_information = GNUNET_new(struct MLP_information); + } else - LOG (GNUNET_ERROR_TYPE_ERROR, - _("Adding address for peer `%s' multiple times\n"), - GNUNET_i2s(&address->peer)); + LOG(GNUNET_ERROR_TYPE_ERROR, + _("Adding address for peer `%s' multiple times\n"), + GNUNET_i2s(&address->peer)); /* Is this peer included in the problem? */ if (NULL == - GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, - &address->peer)) - { - /* FIXME: should this be an error? */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Adding address for peer `%s' without address request\n", - GNUNET_i2s(&address->peer)); - return; - } + GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, + &address->peer)) + { + /* FIXME: should this be an error? */ + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Adding address for peer `%s' without address request\n", + GNUNET_i2s(&address->peer)); + return; + } - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Adding address for peer `%s' with address request \n", - GNUNET_i2s(&address->peer)); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Adding address for peer `%s' with address request \n", + GNUNET_i2s(&address->peer)); /* Problem size changed: new address for peer with pending request */ mlp->stat_mlp_prob_changed = GNUNET_YES; if (GNUNET_YES == mlp->opt_mlp_auto_solve) - GAS_mlp_solve_problem (solver); + GAS_mlp_solve_problem(solver); } @@ -1899,8 +1943,8 @@ GAS_mlp_address_add (void *solver, * @param address the address */ static void -GAS_mlp_address_property_changed (void *solver, - struct ATS_Address *address) +GAS_mlp_address_property_changed(void *solver, + struct ATS_Address *address) { struct MLP_information *mlpi = address->solver_information; struct GAS_MLP_Handle *mlp = solver; @@ -1909,47 +1953,46 @@ GAS_mlp_address_property_changed (void *solver, return; /* There is no MLP problem to update yet */ if (NULL == mlpi) - { - LOG (GNUNET_ERROR_TYPE_INFO, - _("Updating address property for peer `%s' %p not added before\n"), - GNUNET_i2s (&address->peer), - address); - GNUNET_break (0); - return; - } + { + LOG(GNUNET_ERROR_TYPE_INFO, + _("Updating address property for peer `%s' %p not added before\n"), + GNUNET_i2s(&address->peer), + address); + GNUNET_break(0); + return; + } if (NULL == - GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, - &address->peer)) - { - /* Peer is not requested, so no need to update problem */ - return; - } - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Updating properties for peer `%s'\n", - GNUNET_i2s(&address->peer)); + GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, + &address->peer)) + { + /* Peer is not requested, so no need to update problem */ + return; + } + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Updating properties for peer `%s'\n", + GNUNET_i2s(&address->peer)); if (GNUNET_YES == mlp->opt_dbg_feasibility_only) return; /* Update c7) [r_q[index]][c_b] = f_q * q_averaged[type_index] */ - if ( (GNUNET_YES == - mlp_create_problem_update_value (&mlp->p, - mlp->p.r_q[RQ_QUALITY_METRIC_DELAY], - mlpi->c_b, - address->norm_delay.norm, - __LINE__)) || - (GNUNET_YES == - mlp_create_problem_update_value (&mlp->p, - mlp->p.r_q[RQ_QUALITY_METRIC_DISTANCE], - mlpi->c_b, - address->norm_distance.norm, - __LINE__)) ) - { - mlp->stat_mlp_prob_updated = GNUNET_YES; - if (GNUNET_YES == mlp->opt_mlp_auto_solve) - GAS_mlp_solve_problem (solver); - } - + if ((GNUNET_YES == + mlp_create_problem_update_value(&mlp->p, + mlp->p.r_q[RQ_QUALITY_METRIC_DELAY], + mlpi->c_b, + address->norm_delay.norm, + __LINE__)) || + (GNUNET_YES == + mlp_create_problem_update_value(&mlp->p, + mlp->p.r_q[RQ_QUALITY_METRIC_DISTANCE], + mlpi->c_b, + address->norm_distance.norm, + __LINE__))) + { + mlp->stat_mlp_prob_updated = GNUNET_YES; + if (GNUNET_YES == mlp->opt_mlp_auto_solve) + GAS_mlp_solve_problem(solver); + } } @@ -1961,9 +2004,9 @@ GAS_mlp_address_property_changed (void *solver, * @return #GNUNET_OK */ static int -mlp_get_preferred_address_it (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) +mlp_get_preferred_address_it(void *cls, + const struct GNUNET_PeerIdentity *key, + void *value) { static int counter = 0; struct ATS_Address **aa = cls; @@ -1983,41 +2026,40 @@ mlp_get_preferred_address_it (void *cls, */ if (GNUNET_YES == mlpi->n) - { - - (*aa) = addr; - (*aa)->assigned_bw_in = mlpi->b_in; - (*aa)->assigned_bw_out = mlpi->b_out; - return GNUNET_NO; - } + { + (*aa) = addr; + (*aa)->assigned_bw_in = mlpi->b_in; + (*aa)->assigned_bw_out = mlpi->b_out; + return GNUNET_NO; + } counter++; return GNUNET_YES; } static double -get_peer_pref_value (struct GAS_MLP_Handle *mlp, - const struct GNUNET_PeerIdentity *peer) +get_peer_pref_value(struct GAS_MLP_Handle *mlp, + const struct GNUNET_PeerIdentity *peer) { double res; const double *preferences; int c; - preferences = mlp->env->get_preferences (mlp->env->cls, peer); + preferences = mlp->env->get_preferences(mlp->env->cls, peer); res = 0.0; for (c = 0; c < GNUNET_ATS_PREFERENCE_END; c++) - { - /* fprintf (stderr, "VALUE[%u] %s %.3f \n", - * c, GNUNET_i2s (&cur->addr->peer), t[c]); */ - res += preferences[c]; - } + { + /* fprintf (stderr, "VALUE[%u] %s %.3f \n", + * c, GNUNET_i2s (&cur->addr->peer), t[c]); */ + res += preferences[c]; + } res /= GNUNET_ATS_PREFERENCE_END; res += 1.0; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Peer preference for peer `%s' == %.2f\n", - GNUNET_i2s(peer), res); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Peer preference for peer `%s' == %.2f\n", + GNUNET_i2s(peer), res); return res; } @@ -2030,51 +2072,51 @@ get_peer_pref_value (struct GAS_MLP_Handle *mlp, * @param peer the peer */ static void -GAS_mlp_get_preferred_address (void *solver, - const struct GNUNET_PeerIdentity *peer) +GAS_mlp_get_preferred_address(void *solver, + const struct GNUNET_PeerIdentity *peer) { struct GAS_MLP_Handle *mlp = solver; struct ATS_Peer *p; struct ATS_Address *res; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Getting preferred address for `%s'\n", - GNUNET_i2s (peer)); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Getting preferred address for `%s'\n", + GNUNET_i2s(peer)); /* Is this peer included in the problem? */ if (NULL == - GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, - peer)) + GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, + peer)) { - LOG (GNUNET_ERROR_TYPE_INFO, "Adding peer `%s' to list of requested_peers with requests\n", - GNUNET_i2s (peer)); + LOG(GNUNET_ERROR_TYPE_INFO, "Adding peer `%s' to list of requested_peers with requests\n", + GNUNET_i2s(peer)); - p = GNUNET_new (struct ATS_Peer); + p = GNUNET_new(struct ATS_Peer); p->id = (*peer); - p->f = get_peer_pref_value (mlp, peer); - GNUNET_CONTAINER_multipeermap_put (mlp->requested_peers, - peer, p, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); + p->f = get_peer_pref_value(mlp, peer); + GNUNET_CONTAINER_multipeermap_put(mlp->requested_peers, + peer, p, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); /* Added new peer, we have to rebuild problem before solving */ mlp->stat_mlp_prob_changed = GNUNET_YES; - if ((GNUNET_YES == mlp->opt_mlp_auto_solve)&& + if ((GNUNET_YES == mlp->opt_mlp_auto_solve) && (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains(mlp->env->addresses, - peer))) - { - mlp->exclude_peer = peer; - GAS_mlp_solve_problem (mlp); - mlp->exclude_peer = NULL; - } - } + peer))) + { + mlp->exclude_peer = peer; + GAS_mlp_solve_problem(mlp); + mlp->exclude_peer = NULL; + } + } /* Get prefered address */ res = NULL; - GNUNET_CONTAINER_multipeermap_get_multiple (mlp->env->addresses, peer, - &mlp_get_preferred_address_it, &res); + GNUNET_CONTAINER_multipeermap_get_multiple(mlp->env->addresses, peer, + &mlp_get_preferred_address_it, &res); if (NULL != res) - mlp->env->bandwidth_changed_cb (mlp->env->cls, - res); + mlp->env->bandwidth_changed_cb(mlp->env->cls, + res); } @@ -2087,8 +2129,8 @@ GAS_mlp_get_preferred_address (void *solver, * @param address the address to delete */ static void -GAS_mlp_address_delete (void *solver, - struct ATS_Address *address) +GAS_mlp_address_delete(void *solver, + struct ATS_Address *address) { struct GAS_MLP_Handle *mlp = solver; struct MLP_information *mlpi; @@ -2097,11 +2139,11 @@ GAS_mlp_address_delete (void *solver, mlpi = address->solver_information; if (NULL != mlpi) - { - /* Remove full address */ - GNUNET_free (mlpi); - address->solver_information = NULL; - } + { + /* Remove full address */ + GNUNET_free(mlpi); + address->solver_information = NULL; + } was_active = address->active; address->active = GNUNET_NO; address->assigned_bw_in = 0; @@ -2109,38 +2151,38 @@ GAS_mlp_address_delete (void *solver, /* Is this peer included in the problem? */ if (NULL == - GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, - &address->peer)) - { - LOG (GNUNET_ERROR_TYPE_INFO, - "Deleting address for peer `%s' without address request \n", - GNUNET_i2s(&address->peer)); - return; - } - LOG (GNUNET_ERROR_TYPE_INFO, - "Deleting address for peer `%s' with address request \n", - GNUNET_i2s (&address->peer)); + GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, + &address->peer)) + { + LOG(GNUNET_ERROR_TYPE_INFO, + "Deleting address for peer `%s' without address request \n", + GNUNET_i2s(&address->peer)); + return; + } + LOG(GNUNET_ERROR_TYPE_INFO, + "Deleting address for peer `%s' with address request \n", + GNUNET_i2s(&address->peer)); /* Problem size changed: new address for peer with pending request */ mlp->stat_mlp_prob_changed = GNUNET_YES; if (GNUNET_YES == mlp->opt_mlp_auto_solve) - { - GAS_mlp_solve_problem (solver); - } + { + GAS_mlp_solve_problem(solver); + } if (GNUNET_YES == was_active) - { - GAS_mlp_get_preferred_address (solver, &address->peer); - res = NULL; - GNUNET_CONTAINER_multipeermap_get_multiple (mlp->env->addresses, - &address->peer, - &mlp_get_preferred_address_it, - &res); - if (NULL == res) - { - /* No alternative address, disconnecting peer */ - mlp->env->bandwidth_changed_cb (mlp->env->cls, address); - } - } + { + GAS_mlp_get_preferred_address(solver, &address->peer); + res = NULL; + GNUNET_CONTAINER_multipeermap_get_multiple(mlp->env->addresses, + &address->peer, + &mlp_get_preferred_address_it, + &res); + if (NULL == res) + { + /* No alternative address, disconnecting peer */ + mlp->env->bandwidth_changed_cb(mlp->env->cls, address); + } + } } @@ -2150,38 +2192,38 @@ GAS_mlp_address_delete (void *solver, * @param solver the solver */ static void -GAS_mlp_bulk_start (void *solver) +GAS_mlp_bulk_start(void *solver) { struct GAS_MLP_Handle *s = solver; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Locking solver for bulk operation ...\n"); - GNUNET_assert (NULL != solver); - s->stat_bulk_lock ++; + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Locking solver for bulk operation ...\n"); + GNUNET_assert(NULL != solver); + s->stat_bulk_lock++; } static void -GAS_mlp_bulk_stop (void *solver) +GAS_mlp_bulk_stop(void *solver) { struct GAS_MLP_Handle *s = solver; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Unlocking solver from bulk operation ...\n"); - GNUNET_assert (NULL != solver); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Unlocking solver from bulk operation ...\n"); + GNUNET_assert(NULL != solver); if (s->stat_bulk_lock < 1) - { - GNUNET_break (0); - return; - } - s->stat_bulk_lock --; + { + GNUNET_break(0); + return; + } + s->stat_bulk_lock--; if (0 < s->stat_bulk_requests) - { - GAS_mlp_solve_problem (solver); - s->stat_bulk_requests= 0; - } + { + GAS_mlp_solve_problem(solver); + s->stat_bulk_requests = 0; + } } @@ -2193,26 +2235,26 @@ GAS_mlp_bulk_stop (void *solver) * @param peer the peer */ static void -GAS_mlp_stop_get_preferred_address (void *solver, - const struct GNUNET_PeerIdentity *peer) +GAS_mlp_stop_get_preferred_address(void *solver, + const struct GNUNET_PeerIdentity *peer) { struct GAS_MLP_Handle *mlp = solver; struct ATS_Peer *p = NULL; - GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != peer); - if (NULL != (p = GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, peer))) - { - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (mlp->requested_peers, peer, p)); - GNUNET_free (p); - - mlp->stat_mlp_prob_changed = GNUNET_YES; - if (GNUNET_YES == mlp->opt_mlp_auto_solve) + GNUNET_assert(NULL != solver); + GNUNET_assert(NULL != peer); + if (NULL != (p = GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, peer))) { - GAS_mlp_solve_problem (solver); + GNUNET_assert(GNUNET_YES == + GNUNET_CONTAINER_multipeermap_remove(mlp->requested_peers, peer, p)); + GNUNET_free(p); + + mlp->stat_mlp_prob_changed = GNUNET_YES; + if (GNUNET_YES == mlp->opt_mlp_auto_solve) + { + GAS_mlp_solve_problem(solver); + } } - } } @@ -2225,48 +2267,48 @@ GAS_mlp_stop_get_preferred_address (void *solver, * @param pref_rel the relative score */ static void -GAS_mlp_address_change_preference (void *solver, - const struct GNUNET_PeerIdentity *peer, - enum GNUNET_ATS_PreferenceKind kind, - double pref_rel) +GAS_mlp_address_change_preference(void *solver, + const struct GNUNET_PeerIdentity *peer, + enum GNUNET_ATS_PreferenceKind kind, + double pref_rel) { struct GAS_MLP_Handle *mlp = solver; struct ATS_Peer *p; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Changing preference for address for peer `%s' to %.2f\n", - GNUNET_i2s(peer), - pref_rel); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Changing preference for address for peer `%s' to %.2f\n", + GNUNET_i2s(peer), + pref_rel); - GNUNET_STATISTICS_update (mlp->env->stats, - "# LP address preference changes", 1, GNUNET_NO); + GNUNET_STATISTICS_update(mlp->env->stats, + "# LP address preference changes", 1, GNUNET_NO); /* Update the constraints with changed preferences */ /* Update relativity constraint c9 */ - if (NULL == (p = GNUNET_CONTAINER_multipeermap_get (mlp->requested_peers, peer))) - { - LOG (GNUNET_ERROR_TYPE_INFO, - "Updating preference for unknown peer `%s'\n", - GNUNET_i2s(peer)); - return; - } + if (NULL == (p = GNUNET_CONTAINER_multipeermap_get(mlp->requested_peers, peer))) + { + LOG(GNUNET_ERROR_TYPE_INFO, + "Updating preference for unknown peer `%s'\n", + GNUNET_i2s(peer)); + return; + } if (GNUNET_NO == mlp->opt_dbg_feasibility_only) - { - p->f = get_peer_pref_value (mlp, peer); - mlp_create_problem_update_value (&mlp->p, - p->r_c9, - mlp->p.c_r, - - p->f, - __LINE__); - - /* Problem size changed: new address for peer with pending request */ - mlp->stat_mlp_prob_updated = GNUNET_YES; - if (GNUNET_YES == mlp->opt_mlp_auto_solve) - GAS_mlp_solve_problem (solver); - } + { + p->f = get_peer_pref_value(mlp, peer); + mlp_create_problem_update_value(&mlp->p, + p->r_c9, + mlp->p.c_r, + -p->f, + __LINE__); + + /* Problem size changed: new address for peer with pending request */ + mlp->stat_mlp_prob_updated = GNUNET_YES; + if (GNUNET_YES == mlp->opt_mlp_auto_solve) + GAS_mlp_solve_problem(solver); + } } @@ -2281,31 +2323,31 @@ GAS_mlp_address_change_preference (void *solver, * @param score the score */ static void -GAS_mlp_address_preference_feedback (void *solver, - struct GNUNET_SERVICE_Client *application, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TIME_Relative scope, - enum GNUNET_ATS_PreferenceKind kind, - double score) +GAS_mlp_address_preference_feedback(void *solver, + struct GNUNET_SERVICE_Client *application, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_TIME_Relative scope, + enum GNUNET_ATS_PreferenceKind kind, + double score) { struct GAS_PROPORTIONAL_Handle *s = solver; - GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != peer); - GNUNET_assert (NULL != s); + GNUNET_assert(NULL != solver); + GNUNET_assert(NULL != peer); + GNUNET_assert(NULL != s); } static int -mlp_free_peers (void *cls, - const struct GNUNET_PeerIdentity *key, void *value) +mlp_free_peers(void *cls, + const struct GNUNET_PeerIdentity *key, void *value) { struct GNUNET_CONTAINER_MultiPeerMap *map = cls; struct ATS_Peer *p = value; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (map, key, value)); - GNUNET_free (p); + GNUNET_assert(GNUNET_YES == + GNUNET_CONTAINER_multipeermap_remove(map, key, value)); + GNUNET_free(p); return GNUNET_OK; } @@ -2318,36 +2360,36 @@ mlp_free_peers (void *cls, * @return NULL */ void * -libgnunet_plugin_ats_mlp_done (void *cls) +libgnunet_plugin_ats_mlp_done(void *cls) { struct GNUNET_ATS_SolverFunctions *sf = cls; struct GAS_MLP_Handle *mlp = sf->cls; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Shutting down mlp solver\n"); - mlp_delete_problem (mlp); - GNUNET_CONTAINER_multipeermap_iterate (mlp->requested_peers, - &mlp_free_peers, - mlp->requested_peers); - GNUNET_CONTAINER_multipeermap_destroy (mlp->requested_peers); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Shutting down mlp solver\n"); + mlp_delete_problem(mlp); + GNUNET_CONTAINER_multipeermap_iterate(mlp->requested_peers, + &mlp_free_peers, + mlp->requested_peers); + GNUNET_CONTAINER_multipeermap_destroy(mlp->requested_peers); mlp->requested_peers = NULL; /* Clean up GLPK environment */ glp_free_env(); - GNUNET_free (mlp); + GNUNET_free(mlp); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Shutdown down of mlp solver complete\n"); + LOG(GNUNET_ERROR_TYPE_DEBUG, + "Shutdown down of mlp solver complete\n"); return NULL; } void * -libgnunet_plugin_ats_mlp_init (void *cls) +libgnunet_plugin_ats_mlp_init(void *cls) { static struct GNUNET_ATS_SolverFunctions sf; struct GNUNET_ATS_PluginEnvironment *env = cls; - struct GAS_MLP_Handle * mlp = GNUNET_new (struct GAS_MLP_Handle); + struct GAS_MLP_Handle * mlp = GNUNET_new(struct GAS_MLP_Handle); float f_tmp; unsigned long long tmp; unsigned int b_min; @@ -2360,349 +2402,355 @@ libgnunet_plugin_ats_mlp_init (void *cls) /* Init GLPK environment */ int res = glp_init_env(); - switch (res) { + + switch (res) + { case 0: - LOG (GNUNET_ERROR_TYPE_DEBUG, "GLPK: `%s'\n", + LOG(GNUNET_ERROR_TYPE_DEBUG, "GLPK: `%s'\n", "initialization successful"); break; + case 1: - LOG (GNUNET_ERROR_TYPE_DEBUG, "GLPK: `%s'\n", + LOG(GNUNET_ERROR_TYPE_DEBUG, "GLPK: `%s'\n", "environment is already initialized"); break; + case 2: - LOG (GNUNET_ERROR_TYPE_ERROR, "Could not init GLPK: `%s'\n", + LOG(GNUNET_ERROR_TYPE_ERROR, "Could not init GLPK: `%s'\n", "initialization failed (insufficient memory)"); GNUNET_free(mlp); return NULL; break; + case 3: - LOG (GNUNET_ERROR_TYPE_ERROR, "Could not init GLPK: `%s'\n", + LOG(GNUNET_ERROR_TYPE_ERROR, "Could not init GLPK: `%s'\n", "initialization failed (unsupported programming model)"); GNUNET_free(mlp); return NULL; break; + default: break; - } + } - mlp->opt_dump_problem_all = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DUMP_PROBLEM_ALL"); + mlp->opt_dump_problem_all = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DUMP_PROBLEM_ALL"); if (GNUNET_SYSERR == mlp->opt_dump_problem_all) - mlp->opt_dump_problem_all = GNUNET_NO; + mlp->opt_dump_problem_all = GNUNET_NO; - mlp->opt_dump_solution_all = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DUMP_SOLUTION_ALL"); + mlp->opt_dump_solution_all = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DUMP_SOLUTION_ALL"); if (GNUNET_SYSERR == mlp->opt_dump_solution_all) - mlp->opt_dump_solution_all = GNUNET_NO; + mlp->opt_dump_solution_all = GNUNET_NO; - mlp->opt_dump_problem_on_fail = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DUMP_PROBLEM_ON_FAIL"); + mlp->opt_dump_problem_on_fail = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DUMP_PROBLEM_ON_FAIL"); if (GNUNET_SYSERR == mlp->opt_dump_problem_on_fail) - mlp->opt_dump_problem_on_fail = GNUNET_NO; + mlp->opt_dump_problem_on_fail = GNUNET_NO; - mlp->opt_dump_solution_on_fail = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DUMP_SOLUTION_ON_FAIL"); + mlp->opt_dump_solution_on_fail = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DUMP_SOLUTION_ON_FAIL"); if (GNUNET_SYSERR == mlp->opt_dump_solution_on_fail) - mlp->opt_dump_solution_on_fail = GNUNET_NO; + mlp->opt_dump_solution_on_fail = GNUNET_NO; - mlp->opt_dbg_glpk_verbose = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_GLPK_VERBOSE"); + mlp->opt_dbg_glpk_verbose = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_GLPK_VERBOSE"); if (GNUNET_SYSERR == mlp->opt_dbg_glpk_verbose) - mlp->opt_dbg_glpk_verbose = GNUNET_NO; + mlp->opt_dbg_glpk_verbose = GNUNET_NO; - mlp->opt_dbg_feasibility_only = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_FEASIBILITY_ONLY"); + mlp->opt_dbg_feasibility_only = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_FEASIBILITY_ONLY"); if (GNUNET_SYSERR == mlp->opt_dbg_feasibility_only) - mlp->opt_dbg_feasibility_only = GNUNET_NO; + mlp->opt_dbg_feasibility_only = GNUNET_NO; if (GNUNET_YES == mlp->opt_dbg_feasibility_only) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is configured to check feasibility only!\n"); - mlp->opt_dbg_autoscale_problem = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_AUTOSCALE_PROBLEM"); + mlp->opt_dbg_autoscale_problem = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_AUTOSCALE_PROBLEM"); if (GNUNET_SYSERR == mlp->opt_dbg_autoscale_problem) - mlp->opt_dbg_autoscale_problem = GNUNET_NO; + mlp->opt_dbg_autoscale_problem = GNUNET_NO; if (GNUNET_YES == mlp->opt_dbg_autoscale_problem) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is configured automatically scale the problem!\n"); - mlp->opt_dbg_intopt_presolver = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_INTOPT_PRESOLVE"); + mlp->opt_dbg_intopt_presolver = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_INTOPT_PRESOLVE"); if (GNUNET_SYSERR == mlp->opt_dbg_intopt_presolver) - mlp->opt_dbg_intopt_presolver = GNUNET_NO; + mlp->opt_dbg_intopt_presolver = GNUNET_NO; if (GNUNET_YES == mlp->opt_dbg_intopt_presolver) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is configured use the mlp presolver\n"); - mlp->opt_dbg_optimize_diversity = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_OPTIMIZE_DIVERSITY"); + mlp->opt_dbg_optimize_diversity = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_OPTIMIZE_DIVERSITY"); if (GNUNET_SYSERR == mlp->opt_dbg_optimize_diversity) - mlp->opt_dbg_optimize_diversity = GNUNET_YES; + mlp->opt_dbg_optimize_diversity = GNUNET_YES; if (GNUNET_NO == mlp->opt_dbg_optimize_diversity) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is not optimizing for diversity\n"); - mlp->opt_dbg_optimize_relativity= GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_OPTIMIZE_RELATIVITY"); + mlp->opt_dbg_optimize_relativity = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_OPTIMIZE_RELATIVITY"); if (GNUNET_SYSERR == mlp->opt_dbg_optimize_relativity) - mlp->opt_dbg_optimize_relativity = GNUNET_YES; + mlp->opt_dbg_optimize_relativity = GNUNET_YES; if (GNUNET_NO == mlp->opt_dbg_optimize_relativity) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is not optimizing for relativity\n"); - mlp->opt_dbg_optimize_quality = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_OPTIMIZE_QUALITY"); + mlp->opt_dbg_optimize_quality = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_OPTIMIZE_QUALITY"); if (GNUNET_SYSERR == mlp->opt_dbg_optimize_quality) - mlp->opt_dbg_optimize_quality = GNUNET_YES; + mlp->opt_dbg_optimize_quality = GNUNET_YES; if (GNUNET_NO == mlp->opt_dbg_optimize_quality) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is not optimizing for quality\n"); - mlp->opt_dbg_optimize_utility = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, - "ats", "MLP_DBG_OPTIMIZE_UTILITY"); + mlp->opt_dbg_optimize_utility = GNUNET_CONFIGURATION_get_value_yesno(env->cfg, + "ats", "MLP_DBG_OPTIMIZE_UTILITY"); if (GNUNET_SYSERR == mlp->opt_dbg_optimize_utility) - mlp->opt_dbg_optimize_utility = GNUNET_YES; + mlp->opt_dbg_optimize_utility = GNUNET_YES; if (GNUNET_NO == mlp->opt_dbg_optimize_utility) - LOG (GNUNET_ERROR_TYPE_WARNING, + LOG(GNUNET_ERROR_TYPE_WARNING, "MLP solver is not optimizing for utility\n"); - if ( (GNUNET_NO == mlp->opt_dbg_optimize_utility) && - (GNUNET_NO == mlp->opt_dbg_optimize_quality) && - (GNUNET_NO == mlp->opt_dbg_optimize_relativity) && - (GNUNET_NO == mlp->opt_dbg_optimize_utility) && - (GNUNET_NO == mlp->opt_dbg_feasibility_only)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - _("MLP solver is not optimizing for anything, changing to feasibility check\n")); - mlp->opt_dbg_feasibility_only = GNUNET_YES; - } - - if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (env->cfg, - "ats", "MLP_LOG_FORMAT", &outputformat)) - mlp->opt_log_format = MLP_CPLEX; - else - { - GNUNET_STRINGS_utf8_toupper(outputformat, outputformat); - if (0 == strcmp (outputformat, "MPS")) - { - mlp->opt_log_format = MLP_MPS; - } - else if (0 == strcmp (outputformat, "CPLEX")) + if ((GNUNET_NO == mlp->opt_dbg_optimize_utility) && + (GNUNET_NO == mlp->opt_dbg_optimize_quality) && + (GNUNET_NO == mlp->opt_dbg_optimize_relativity) && + (GNUNET_NO == mlp->opt_dbg_optimize_utility) && + (GNUNET_NO == mlp->opt_dbg_feasibility_only)) { - mlp->opt_log_format = MLP_CPLEX; + LOG(GNUNET_ERROR_TYPE_ERROR, + _("MLP solver is not optimizing for anything, changing to feasibility check\n")); + mlp->opt_dbg_feasibility_only = GNUNET_YES; } - else if (0 == strcmp (outputformat, "GLPK")) - { - mlp->opt_log_format = MLP_GLPK; - } - else + + if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string(env->cfg, + "ats", "MLP_LOG_FORMAT", &outputformat)) + mlp->opt_log_format = MLP_CPLEX; + else { - LOG (GNUNET_ERROR_TYPE_WARNING, - "Invalid log format `%s' in configuration, using CPLEX!\n", - outputformat); - mlp->opt_log_format = MLP_CPLEX; + GNUNET_STRINGS_utf8_toupper(outputformat, outputformat); + if (0 == strcmp(outputformat, "MPS")) + { + mlp->opt_log_format = MLP_MPS; + } + else if (0 == strcmp(outputformat, "CPLEX")) + { + mlp->opt_log_format = MLP_CPLEX; + } + else if (0 == strcmp(outputformat, "GLPK")) + { + mlp->opt_log_format = MLP_GLPK; + } + else + { + LOG(GNUNET_ERROR_TYPE_WARNING, + "Invalid log format `%s' in configuration, using CPLEX!\n", + outputformat); + mlp->opt_log_format = MLP_CPLEX; + } + GNUNET_free(outputformat); } - GNUNET_free (outputformat); - } - mlp->pv.BIG_M = (double) BIG_M_VALUE; + mlp->pv.BIG_M = (double)BIG_M_VALUE; - mlp->pv.mip_gap = (double) 0.0; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "MLP_MAX_MIP_GAP", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 1.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "MIP gap", f_tmp); - } - else + mlp->pv.mip_gap = (double)0.0; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float(env->cfg, "ats", + "MLP_MAX_MIP_GAP", &f_tmp)) { - mlp->pv.mip_gap = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", - "MIP gap", f_tmp); + if ((f_tmp < 0.0) || (f_tmp > 1.0)) + { + LOG(GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "MIP gap", f_tmp); + } + else + { + mlp->pv.mip_gap = f_tmp; + LOG(GNUNET_ERROR_TYPE_INFO, "Using %s of %.3f\n", + "MIP gap", f_tmp); + } } - } - mlp->pv.lp_mip_gap = (double) 0.0; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "MLP_MAX_LP_MIP_GAP", &f_tmp)) - { - if ((f_tmp < 0.0) || (f_tmp > 1.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "LP/MIP", f_tmp); - } - else + mlp->pv.lp_mip_gap = (double)0.0; + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float(env->cfg, "ats", + "MLP_MAX_LP_MIP_GAP", &f_tmp)) { - mlp->pv.lp_mip_gap = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", - "LP/MIP", f_tmp); + if ((f_tmp < 0.0) || (f_tmp > 1.0)) + { + LOG(GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "LP/MIP", f_tmp); + } + else + { + mlp->pv.lp_mip_gap = f_tmp; + LOG(GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", + "LP/MIP", f_tmp); + } } - } /* Get timeout for iterations */ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time(env->cfg, "ats", - "MLP_MAX_DURATION", &max_duration)) - { - max_duration = MLP_MAX_EXEC_DURATION; - } + "MLP_MAX_DURATION", &max_duration)) + { + max_duration = MLP_MAX_EXEC_DURATION; + } /* Get maximum number of iterations */ if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_size(env->cfg, "ats", - "MLP_MAX_ITERATIONS", &max_iterations)) - { - max_iterations = MLP_MAX_ITERATIONS; - } + "MLP_MAX_ITERATIONS", &max_iterations)) + { + max_iterations = MLP_MAX_ITERATIONS; + } /* Get diversity coefficient from configuration */ mlp->pv.co_D = MLP_DEFAULT_D; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "MLP_COEFFICIENT_D", &f_tmp)) - { - if ((f_tmp < 0.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "MLP_COEFFICIENT_D", f_tmp); - } - else + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float(env->cfg, "ats", + "MLP_COEFFICIENT_D", &f_tmp)) { - mlp->pv.co_D = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", - "MLP_COEFFICIENT_D", f_tmp); + if ((f_tmp < 0.0)) + { + LOG(GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "MLP_COEFFICIENT_D", f_tmp); + } + else + { + mlp->pv.co_D = f_tmp; + LOG(GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", + "MLP_COEFFICIENT_D", f_tmp); + } } - } /* Get relativity coefficient from configuration */ mlp->pv.co_R = MLP_DEFAULT_R; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "MLP_COEFFICIENT_R", &f_tmp)) - { - if ((f_tmp < 0.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "MLP_COEFFICIENT_R", f_tmp); - } - else + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float(env->cfg, "ats", + "MLP_COEFFICIENT_R", &f_tmp)) { - mlp->pv.co_R = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", - "MLP_COEFFICIENT_R", f_tmp); + if ((f_tmp < 0.0)) + { + LOG(GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "MLP_COEFFICIENT_R", f_tmp); + } + else + { + mlp->pv.co_R = f_tmp; + LOG(GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", + "MLP_COEFFICIENT_R", f_tmp); + } } - } /* Get utilization coefficient from configuration */ mlp->pv.co_U = MLP_DEFAULT_U; - if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float (env->cfg, "ats", - "MLP_COEFFICIENT_U", &f_tmp)) - { - if ((f_tmp < 0.0)) - { - LOG (GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), - "MLP_COEFFICIENT_U", f_tmp); - } - else + if (GNUNET_SYSERR != GNUNET_CONFIGURATION_get_value_float(env->cfg, "ats", + "MLP_COEFFICIENT_U", &f_tmp)) { - mlp->pv.co_U = f_tmp; - LOG (GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", - "MLP_COEFFICIENT_U", f_tmp); + if ((f_tmp < 0.0)) + { + LOG(GNUNET_ERROR_TYPE_ERROR, _("Invalid %s configuration %f \n"), + "MLP_COEFFICIENT_U", f_tmp); + } + else + { + mlp->pv.co_U = f_tmp; + LOG(GNUNET_ERROR_TYPE_INFO, "Using %s gap of %.3f\n", + "MLP_COEFFICIENT_U", f_tmp); + } } - } /* Get quality metric coefficients from configuration */ for (c = 0; c < RQ_QUALITY_METRIC_COUNT; c++) - { - /* initialize quality coefficients with default value 1.0 */ - mlp->pv.co_Q[c] = MLP_DEFAULT_QUALITY; - } + { + /* initialize quality coefficients with default value 1.0 */ + mlp->pv.co_Q[c] = MLP_DEFAULT_QUALITY; + } if (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_size (env->cfg, "ats", - "MLP_COEFFICIENT_QUALITY_DELAY", - &tmp)) - mlp->pv.co_Q[RQ_QUALITY_METRIC_DELAY] = (double) tmp / 100; + GNUNET_CONFIGURATION_get_value_size(env->cfg, "ats", + "MLP_COEFFICIENT_QUALITY_DELAY", + &tmp)) + mlp->pv.co_Q[RQ_QUALITY_METRIC_DELAY] = (double)tmp / 100; else mlp->pv.co_Q[RQ_QUALITY_METRIC_DELAY] = MLP_DEFAULT_QUALITY; if (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_size (env->cfg, "ats", - "MLP_COEFFICIENT_QUALITY_DISTANCE", - &tmp)) - mlp->pv.co_Q[RQ_QUALITY_METRIC_DISTANCE] = (double) tmp / 100; + GNUNET_CONFIGURATION_get_value_size(env->cfg, "ats", + "MLP_COEFFICIENT_QUALITY_DISTANCE", + &tmp)) + mlp->pv.co_Q[RQ_QUALITY_METRIC_DISTANCE] = (double)tmp / 100; else mlp->pv.co_Q[RQ_QUALITY_METRIC_DISTANCE] = MLP_DEFAULT_QUALITY; /* Get minimum bandwidth per used address from configuration */ - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_size (env->cfg, "ats", - "MLP_MIN_BANDWIDTH", - &tmp)) + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_size(env->cfg, "ats", + "MLP_MIN_BANDWIDTH", + &tmp)) b_min = tmp; else - { - b_min = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__); - } + { + b_min = ntohl(GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__); + } /* Get minimum number of connections from configuration */ - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_size (env->cfg, "ats", - "MLP_MIN_CONNECTIONS", - &tmp)) + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_size(env->cfg, "ats", + "MLP_MIN_CONNECTIONS", + &tmp)) n_min = tmp; else n_min = MLP_DEFAULT_MIN_CONNECTIONS; /* Init network quotas */ for (c = 0; c < GNUNET_NT_COUNT; c++) - { - mlp->pv.quota_index[c] = c; - mlp->pv.quota_out[c] = env->out_quota[c]; - mlp->pv.quota_in[c] = env->in_quota[c]; - - LOG (GNUNET_ERROR_TYPE_INFO, - "Quota for network `%s' (in/out) %llu/%llu\n", - GNUNET_NT_to_string (c), - mlp->pv.quota_out[c], - mlp->pv.quota_in[c]); - /* Check if defined quota could make problem unsolvable */ - if ((n_min * b_min) > mlp->pv.quota_out[c]) - { - LOG (GNUNET_ERROR_TYPE_INFO, - _("Adjusting inconsistent outbound quota configuration for network `%s', is %llu must be at least %llu\n"), - GNUNET_NT_to_string(mlp->pv.quota_index[c]), - mlp->pv.quota_out[c], - (n_min * b_min)); - mlp->pv.quota_out[c] = (n_min * b_min); - } - if ((n_min * b_min) > mlp->pv.quota_in[c]) - { - LOG (GNUNET_ERROR_TYPE_INFO, - _("Adjusting inconsistent inbound quota configuration for network `%s', is %llu must be at least %llu\n"), - GNUNET_NT_to_string(mlp->pv.quota_index[c]), - mlp->pv.quota_in[c], - (n_min * b_min)); - mlp->pv.quota_in[c] = (n_min * b_min); - } - /* Check if bandwidth is too big to make problem solvable */ - if (mlp->pv.BIG_M < mlp->pv.quota_out[c]) - { - LOG (GNUNET_ERROR_TYPE_INFO, - _("Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"), - GNUNET_NT_to_string(mlp->pv.quota_index[c]), - mlp->pv.quota_out[c], - mlp->pv.BIG_M); - mlp->pv.quota_out[c] = mlp->pv.BIG_M ; - } - if (mlp->pv.BIG_M < mlp->pv.quota_in[c]) - { - LOG (GNUNET_ERROR_TYPE_INFO, - _("Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"), - GNUNET_NT_to_string(mlp->pv.quota_index[c]), - mlp->pv.quota_in[c], - mlp->pv.BIG_M); - mlp->pv.quota_in[c] = mlp->pv.BIG_M ; - } - } + { + mlp->pv.quota_index[c] = c; + mlp->pv.quota_out[c] = env->out_quota[c]; + mlp->pv.quota_in[c] = env->in_quota[c]; + + LOG(GNUNET_ERROR_TYPE_INFO, + "Quota for network `%s' (in/out) %llu/%llu\n", + GNUNET_NT_to_string(c), + mlp->pv.quota_out[c], + mlp->pv.quota_in[c]); + /* Check if defined quota could make problem unsolvable */ + if ((n_min * b_min) > mlp->pv.quota_out[c]) + { + LOG(GNUNET_ERROR_TYPE_INFO, + _("Adjusting inconsistent outbound quota configuration for network `%s', is %llu must be at least %llu\n"), + GNUNET_NT_to_string(mlp->pv.quota_index[c]), + mlp->pv.quota_out[c], + (n_min * b_min)); + mlp->pv.quota_out[c] = (n_min * b_min); + } + if ((n_min * b_min) > mlp->pv.quota_in[c]) + { + LOG(GNUNET_ERROR_TYPE_INFO, + _("Adjusting inconsistent inbound quota configuration for network `%s', is %llu must be at least %llu\n"), + GNUNET_NT_to_string(mlp->pv.quota_index[c]), + mlp->pv.quota_in[c], + (n_min * b_min)); + mlp->pv.quota_in[c] = (n_min * b_min); + } + /* Check if bandwidth is too big to make problem solvable */ + if (mlp->pv.BIG_M < mlp->pv.quota_out[c]) + { + LOG(GNUNET_ERROR_TYPE_INFO, + _("Adjusting outbound quota configuration for network `%s'from %llu to %.0f\n"), + GNUNET_NT_to_string(mlp->pv.quota_index[c]), + mlp->pv.quota_out[c], + mlp->pv.BIG_M); + mlp->pv.quota_out[c] = mlp->pv.BIG_M; + } + if (mlp->pv.BIG_M < mlp->pv.quota_in[c]) + { + LOG(GNUNET_ERROR_TYPE_INFO, + _("Adjusting inbound quota configuration for network `%s' from %llu to %.0f\n"), + GNUNET_NT_to_string(mlp->pv.quota_index[c]), + mlp->pv.quota_in[c], + mlp->pv.BIG_M); + mlp->pv.quota_in[c] = mlp->pv.BIG_M; + } + } mlp->env = env; sf.cls = mlp; sf.s_add = &GAS_mlp_address_add; @@ -2722,13 +2770,13 @@ libgnunet_plugin_ats_mlp_init (void *cls) mlp->stat_mlp_prob_changed = GNUNET_NO; mlp->stat_mlp_prob_updated = GNUNET_NO; mlp->opt_mlp_auto_solve = GNUNET_YES; - mlp->requested_peers = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); + mlp->requested_peers = GNUNET_CONTAINER_multipeermap_create(10, GNUNET_NO); mlp->stat_bulk_requests = 0; mlp->stat_bulk_lock = 0; /* Setup GLPK */ /* Redirect GLPK output to GNUnet logging */ - glp_term_hook (&mlp_term_hook, (void *) mlp); + glp_term_hook(&mlp_term_hook, (void *)mlp); /* Init LP solving parameters */ glp_init_smcp(&mlp->control_param_lp); @@ -2750,7 +2798,7 @@ libgnunet_plugin_ats_mlp_init (void *cls) mlp->control_param_mlp.msg_lev = GLP_MSG_ALL; mlp->control_param_mlp.tm_lim = max_duration.rel_value_us / 1000LL; - LOG (GNUNET_ERROR_TYPE_DEBUG, "solver ready\n"); + LOG(GNUNET_ERROR_TYPE_DEBUG, "solver ready\n"); return &sf; } -- cgit v1.2.3