2 This file is part of GNUnet.
3 (C) 2009 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
21 * @file transport/perf_transport_ats.c
22 * @brief testcase for ats functionality
25 #include "gnunet_time_lib.h"
29 #define VERBOSE GNUNET_NO
35 static int executions = EXECS;
36 static uint64_t exec_time[EXECS];
38 static uint64_t sim_no_opt_avg;
39 static uint64_t sim_with_opt_avg;
40 static uint64_t mlp_no_opt_avg;
41 static uint64_t mlp_with_opt_avg;
43 static glp_prob *prob;
45 static struct GNUNET_TIME_Absolute start;
46 static struct GNUNET_TIME_Absolute end;
49 solve_mlp (int presolve)
54 glp_init_iocp (&opt_mlp);
55 opt_mlp.msg_lev = GLP_MSG_OFF;
56 opt_mlp.presolve = GLP_OFF;
58 result = glp_intopt (prob, &opt_mlp);
59 solution = glp_mip_status (prob);
60 GNUNET_assert ((solution == 5) && (result == 0));
64 solve_lp (int presolve)
71 glp_init_smcp (&opt_lp);
73 opt_lp.msg_lev = GLP_MSG_OFF;
74 if (presolve == GNUNET_YES)
75 opt_lp.presolve = GLP_ON;
77 opt_lp.presolve = GLP_OFF;
79 result = glp_simplex (prob, &opt_lp);
80 solution = glp_get_status (prob);
81 GNUNET_assert ((solution == 5) && (result == 0));
85 /* Modify quality constraint */
87 modify_qm (int start, int length, int values_to_change)
89 //int * ind = GNUNET_malloc (length * sizeof (int));
90 //double *val = GNUNET_malloc (length * sizeof (double));
95 int c = start, c2 = 1;
97 while (c <= (start + values_to_change))
99 res = glp_get_mat_row (prob, c, ind, val);
101 printf ("%i %i \n", c, res);
102 for (c2 = 0; c2 < res; c2++)
104 printf ("%i = %f \n", ind[c2], val[c2]);
108 //glp_set_mat_row(prob, start, length, ind, val);
115 bench_simplex_optimization (char *file, int executions)
120 prob = glp_create_prob ();
121 res = glp_read_lp (prob, NULL, file);
124 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Problem file `%s' not found\n", file);
129 solve_lp (GNUNET_YES);
131 for (c = 0; c < executions; c++)
133 start = GNUNET_TIME_absolute_get ();
134 solve_lp (GNUNET_NO);
135 end = GNUNET_TIME_absolute_get ();
137 exec_time[c] = GNUNET_TIME_absolute_get_difference (start, end).rel_value;
139 sim_with_opt_avg += exec_time[c];
140 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
141 "Simplex /w optimization iterations %i: %llu \n", c,
145 glp_delete_prob (prob);
150 bench_simplex_no_optimization (char *file, int executions)
155 prob = glp_create_prob ();
156 res = glp_read_lp (prob, NULL, file);
159 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Problem file `%s' not found\n", file);
164 for (c = 0; c < executions; c++)
166 start = GNUNET_TIME_absolute_get ();
167 solve_lp (GNUNET_YES);
168 end = GNUNET_TIME_absolute_get ();
170 exec_time[c] = GNUNET_TIME_absolute_get_difference (start, end).rel_value;
172 sim_no_opt_avg += exec_time[c];
173 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Simplex iterations %i: %llu \n", c,
177 glp_delete_prob (prob);
181 bench_mlp_no_optimization (char *file, int executions)
186 prob = glp_create_prob ();
187 res = glp_read_lp (prob, NULL, file);
190 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Problem file `%s' not found\n", file);
194 for (c = 0; c < executions; c++)
196 start = GNUNET_TIME_absolute_get ();
197 solve_lp (GNUNET_YES);
198 solve_mlp (GNUNET_NO);
199 end = GNUNET_TIME_absolute_get ();
201 exec_time[c] = GNUNET_TIME_absolute_get_difference (start, end).rel_value;
203 mlp_no_opt_avg += exec_time[c];
204 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
205 "MLP iterations no optimization %i: %llu \n", c, exec_time[c]);
208 glp_delete_prob (prob);
213 bench_mlp_with_optimization (char *file, int executions, int changes)
218 prob = glp_create_prob ();
219 res = glp_read_lp (prob, NULL, file);
222 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Problem file `%s' not found\n", file);
227 solve_lp (GNUNET_YES);
229 for (c = 0; c < executions; c++)
231 start = GNUNET_TIME_absolute_get ();
232 //modify_qm(906, 0, 0);
233 solve_lp (GNUNET_NO);
234 solve_mlp (GNUNET_NO);
235 end = GNUNET_TIME_absolute_get ();
237 exec_time[c] = GNUNET_TIME_absolute_get_difference (start, end).rel_value;
239 mlp_with_opt_avg += exec_time[c];
240 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
241 "MLP /w optimization iterations %i: %llu \n", c, exec_time[c]);
244 glp_delete_prob (prob);
249 modify_cr (int start, int length, int count)
251 //int * ind = GNUNET_malloc (length * sizeof (int));
252 //double *val = GNUNET_malloc (length * sizeof (double));
256 int c = start, c2 = 1;
258 while (c <= (start + count))
260 res = glp_get_mat_row (prob, c, ind, val);
262 printf ("row index: %i non-zero elements: %i \n", c, res);
263 for (c2 = 1; c2 <= res; c2++)
265 printf ("%i = %f ", ind[c2], val[c2]);
270 //glp_set_mat_row(prob, start, length, ind, val);
276 main (int argc, char *argv[])
279 GNUNET_log_setup ("perf-transport-ats",
286 int nullfd = OPEN ("/dev/null", O_RDWR | O_APPEND);
289 return GNUNET_SYSERR;
290 if (dup2 (nullfd, 1) < 0)
292 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "dup2");
293 (void) CLOSE (nullfd);
294 return GNUNET_SYSERR;
298 char *file = "ats_mlp_p100_m400.problem";
300 bench_simplex_no_optimization (file, executions);
301 bench_simplex_optimization (file, executions);
302 bench_mlp_no_optimization (file, executions);
303 bench_mlp_with_optimization (file, executions, 0);
309 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
310 "Simplex, no optimization, average per address: %f\n",
311 ((double) sim_no_opt_avg / EXECS) / 400);
312 GAUGER ("TRANSPORT", "GLPK simplex no optimization",
313 ((double) sim_no_opt_avg / EXECS) / 400, "ms/address");
315 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
316 "Simplex, with optimization, average per address: %f\n",
317 ((double) sim_with_opt_avg / EXECS) / 400);
319 "GLPK simplex, 100 peers 400 addresses with optimization",
320 ((double) sim_with_opt_avg / EXECS) / 400, "ms/address");
322 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
323 "MLP no optimization average per address: %f\n",
324 ((double) mlp_no_opt_avg / EXECS) / 400);
325 GAUGER ("TRANSPORT", "GLPK MLP 100 peers 400 addresses no optimization",
326 ((double) mlp_no_opt_avg / EXECS) / 400, "ms/address");
328 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
329 "MLP optimization average per address: %f\n",
330 ((double) mlp_with_opt_avg / EXECS) / 400);
331 GAUGER ("TRANSPORT", "GLPK MLP 100 peers 400 addresses with optimization",
332 ((double) mlp_with_opt_avg / EXECS) / 400, "ms/address");
333 (void) CLOSE (nullfd);
337 /* end of perf_transport_ats.c*/