aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-02-22 15:45:15 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-02-22 15:45:15 +0000
commit230f67b5290a2f16a08160537f68a1e3ed5f0240 (patch)
tree162e2f3b970d2b26fa515dedd6fe9d8b63ac16b5
parent66da925f71d9812482308ed4f974209c79a1b05e (diff)
downloadgnunet-230f67b5290a2f16a08160537f68a1e3ed5f0240.tar.gz
gnunet-230f67b5290a2f16a08160537f68a1e3ed5f0240.zip
create constrain function
-rw-r--r--src/ats/gnunet-service-ats_addresses_mlp.c65
1 files changed, 12 insertions, 53 deletions
diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c
index f10e88007..6a103c8b3 100644
--- a/src/ats/gnunet-service-ats_addresses_mlp.c
+++ b/src/ats/gnunet-service-ats_addresses_mlp.c
@@ -941,6 +941,9 @@ mlp_create_problem_create_constraint (struct MLP_Problem *p, char *name,
941 case GLP_DB: 941 case GLP_DB:
942 GNUNET_asprintf(&op, "%.2f <= x <= %.2f", lb, ub); 942 GNUNET_asprintf(&op, "%.2f <= x <= %.2f", lb, ub);
943 break; 943 break;
944 case GLP_FX:
945 GNUNET_asprintf(&op, "%.2f == x == %.2f", lb, ub);
946 break;
944 case GLP_LO: 947 case GLP_LO:
945 GNUNET_asprintf(&op, "%.2f <= x <= inf", lb); 948 GNUNET_asprintf(&op, "%.2f <= x <= inf", lb);
946 break; 949 break;
@@ -1052,78 +1055,34 @@ mlp_create_problem_add_invariant_rows (struct GAS_MLP_Handle *mlp, struct MLP_Pr
1052 int c; 1055 int c;
1053 1056
1054 /* Row for c4) minimum connection */ 1057 /* Row for c4) minimum connection */
1055 name = "c4"; 1058
1056 int min = mlp->pv.n_min;
1057 /* Number of minimum connections is min(|Peers|, n_min) */ 1059 /* Number of minimum connections is min(|Peers|, n_min) */
1058 if (mlp->pv.n_min > p->num_peers) 1060 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);
1059 min = p->num_peers;
1060 p->r_c4 = glp_add_rows (p->prob, 1);
1061 glp_set_row_name (p->prob, p->r_c4, name);
1062 glp_set_row_bnds (p->prob, p->r_c4, GLP_LO, min, min);
1063#if DEBUG_MLP_PROBLEM_CREATION
1064 LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s %u\n",
1065 p->r_c4, name,
1066 ">=", min);
1067#endif
1068 1061
1069 /* Add row for c6) */ 1062 /* Add row for c6) */
1070 name = "c6"; 1063 p->r_c6 = mlp_create_problem_create_constraint (p, "c6", GLP_FX, 0.0, 0.0);
1071 p->r_c6 = glp_add_rows (p->prob, 1);
1072 /* Set type type to fix */
1073 glp_set_row_name (p->prob, p->r_c6, name);
1074 glp_set_row_bnds (p->prob, p->r_c6, GLP_FX, 0.0, 0.0);
1075#if DEBUG_MLP_PROBLEM_CREATION
1076 LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s %u\n",
1077 p->r_c6, name,
1078 "==", 0);
1079#endif
1080 /* c6 )Setting -D */ 1064 /* c6 )Setting -D */
1081 mlp_create_problem_set_value (p, p->r_c6, p->c_d, -1); 1065 mlp_create_problem_set_value (p, p->r_c6, p->c_d, -1);
1082 1066
1083 /* Add rows for c 10) */ 1067 /* Add rows for c 10) */
1084 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++) 1068 for (c = 0; c < GNUNET_ATS_NetworkTypeCount; c++)
1085 { 1069 {
1086 p->r_quota[c] = glp_add_rows (p->prob, 1); 1070 char * text;
1087 char * text; 1071 GNUNET_asprintf(&text, "quota_ats_%s", GNUNET_ATS_print_network_type(mlp->pv.quota_index[c]));
1088 GNUNET_asprintf(&text, "quota_ats_%s", GNUNET_ATS_print_network_type(mlp->pv.quota_index[c])); 1072 p->r_quota[c] = mlp_create_problem_create_constraint (p, text, GLP_DB, 0.0, mlp->pv.quota_out[c]);
1089 glp_set_row_name (p->prob, p->r_quota[c], text); 1073 GNUNET_free (text);
1090 /* Set bounds to 0 <= x <= quota_out */
1091 glp_set_row_bnds (p->prob, p->r_quota[c], GLP_UP, 0.0, mlp->pv.quota_out[c]);
1092#if DEBUG_MLP_PROBLEM_CREATION
1093 LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s %u\n",
1094 p->r_quota[c], text,
1095 "<=", mlp->pv.quota_out[c]);
1096#endif
1097 GNUNET_free (text);
1098 } 1074 }
1099 1075
1100 /* Adding rows for c 8) */ 1076 /* Adding rows for c 8) */
1101 p->r_c8 = glp_add_rows (p->prob, p->num_peers); 1077 p->r_c8 = mlp_create_problem_create_constraint (p, "c8", GLP_FX, 0.0, 0.0);
1102 name = "c8";
1103 glp_set_row_name (p->prob, p->r_c8, "c8");
1104 /* Set row bound == 0 */
1105 glp_set_row_bnds (p->prob, p->r_c8, GLP_FX, 0.0, 0.0);
1106#if DEBUG_MLP_PROBLEM_CREATION
1107 LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s %u\n",
1108 p->r_c8, name,
1109 "==", 0);
1110#endif
1111 /* -u */ 1078 /* -u */
1112 mlp_create_problem_set_value (p, p->r_c8, p->c_u, -1); 1079 mlp_create_problem_set_value (p, p->r_c8, p->c_u, -1);
1113 1080
1114 /* c 7) For all quality metrics */ 1081 /* c 7) For all quality metrics */
1115 for (c = 0; c < mlp->pv.m_q; c++) 1082 for (c = 0; c < mlp->pv.m_q; c++)
1116 { 1083 {
1117 p->r_q[c] = glp_add_rows (p->prob, 1);
1118 GNUNET_asprintf(&name, "c7_q%i_%s", c, mlp_ats_to_string(mlp->pv.q[c])); 1084 GNUNET_asprintf(&name, "c7_q%i_%s", c, mlp_ats_to_string(mlp->pv.q[c]));
1119 glp_set_row_name (p->prob, p->r_q[c], name); 1085 p->r_q[c] = mlp_create_problem_create_constraint (p, name, GLP_FX, 0.0, 0.0);
1120 /* Set row bound == 0 */
1121 glp_set_row_bnds (p->prob, p->r_q[c], GLP_FX, 0.0, 0.0);
1122#if DEBUG_MLP_PROBLEM_CREATION
1123 LOG (GNUNET_ERROR_TYPE_DEBUG, "[P]: Added row [%u] `%s': %s %u\n",
1124 p->r_q[c], name,
1125 "==", 0);
1126#endif
1127 GNUNET_free (name); 1086 GNUNET_free (name);
1128 mlp_create_problem_set_value (p, p->r_q[c], p->c_q[c], -1); 1087 mlp_create_problem_set_value (p, p->r_q[c], p->c_q[c], -1);
1129 } 1088 }