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)
70 glp_init_smcp(&opt_lp);
72 opt_lp.msg_lev = GLP_MSG_OFF;
73 if (presolve==GNUNET_YES) opt_lp.presolve = GLP_ON;
74 else opt_lp.presolve = GLP_OFF;
76 result = glp_simplex(prob, &opt_lp);
77 solution = glp_get_status (prob);
78 GNUNET_assert ((solution == 5) && (result==0));
82 /* Modify quality constraint */
84 modify_qm(int start, int length, int values_to_change)
86 //int * ind = GNUNET_malloc (length * sizeof (int));
87 //double *val = GNUNET_malloc (length * sizeof (double));
93 while (c<=(start+values_to_change))
95 res = glp_get_mat_row(prob, c, ind, val);
97 printf("%i %i \n", c, res);
98 for (c2=0; c2<res; c2++)
100 printf("%i = %f \n", ind[c2], val[c2]);
104 //glp_set_mat_row(prob, start, length, ind, val);
111 bench_simplex_optimization(char * file, int executions)
116 prob = glp_create_prob();
117 res = glp_read_lp(prob, NULL, file);
120 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
121 "Problem file `%s' not found\n", file);
126 solve_lp(GNUNET_YES);
128 for (c=0; c<executions;c++)
130 start = GNUNET_TIME_absolute_get();
132 end = GNUNET_TIME_absolute_get();
134 exec_time[c] = GNUNET_TIME_absolute_get_difference(start, end).rel_value;
136 sim_with_opt_avg += exec_time[c];
137 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
138 "Simplex /w optimization iterations %i: %llu \n", c, exec_time[c]);
141 glp_delete_prob(prob);
146 bench_simplex_no_optimization(char * file, int executions)
151 prob = glp_create_prob();
152 res = glp_read_lp(prob, NULL, file);
155 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
156 "Problem file `%s' not found\n", file);
161 for (c=0; c<executions;c++)
163 start = GNUNET_TIME_absolute_get();
164 solve_lp(GNUNET_YES);
165 end = GNUNET_TIME_absolute_get();
167 exec_time[c] = GNUNET_TIME_absolute_get_difference(start, end).rel_value;
169 sim_no_opt_avg += exec_time[c];
170 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
171 "Simplex iterations %i: %llu \n",
175 glp_delete_prob(prob);
179 bench_mlp_no_optimization(char * file, int executions)
184 prob = glp_create_prob();
185 res = glp_read_lp(prob, NULL, file);
188 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
189 "Problem file `%s' not found\n", file);
193 for (c=0; c<executions;c++)
195 start = GNUNET_TIME_absolute_get();
196 solve_lp(GNUNET_YES);
197 solve_mlp (GNUNET_NO);
198 end = GNUNET_TIME_absolute_get();
200 exec_time[c] = GNUNET_TIME_absolute_get_difference(start, end).rel_value;
202 mlp_no_opt_avg += exec_time[c];
203 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
204 "MLP iterations no optimization %i: %llu \n",
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,
223 "Problem file `%s' not found\n", file);
228 solve_lp(GNUNET_YES);
230 for (c=0; c<executions;c++)
232 start = GNUNET_TIME_absolute_get();
233 //modify_qm(906, 0, 0);
235 solve_mlp (GNUNET_NO);
236 end = GNUNET_TIME_absolute_get();
238 exec_time[c] = GNUNET_TIME_absolute_get_difference(start, end).rel_value;
240 mlp_with_opt_avg += exec_time[c];
241 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
242 "MLP /w optimization iterations %i: %llu \n",
246 glp_delete_prob(prob);
250 void modify_cr (int start, int length, int count)
252 //int * ind = GNUNET_malloc (length * sizeof (int));
253 //double *val = GNUNET_malloc (length * sizeof (double));
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);
275 int main (int argc, char *argv[])
278 GNUNET_log_setup ("perf-transport-ats",
285 int nullfd = OPEN ("/dev/null", O_RDWR | O_APPEND);
287 return GNUNET_SYSERR;
288 if (dup2 (nullfd, 1) < 0)
290 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "dup2");
291 (void) CLOSE (nullfd);
292 return GNUNET_SYSERR;
296 char * file = "ats_mlp_p100_m400.problem";
298 bench_simplex_no_optimization (file, executions);
299 bench_simplex_optimization (file, executions);
300 bench_mlp_no_optimization (file, executions);
301 bench_mlp_with_optimization (file, executions, 0);
307 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
308 "Simplex, no optimization, average per address: %f\n",
309 ((double) sim_no_opt_avg / EXECS) / 400);
310 GAUGER ("TRANSPORT","GLPK simplex no optimization",
311 ((double) sim_no_opt_avg / EXECS) / 400, "ms/address");
313 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
314 "Simplex, with optimization, average per address: %f\n",
315 ((double) sim_with_opt_avg / EXECS) / 400);
317 "GLPK simplex, 100 peers 400 addresses with optimization",
318 ((double) sim_with_opt_avg / EXECS) / 400, "ms/address");
320 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
321 "MLP no optimization average per address: %f\n",
322 ((double) mlp_no_opt_avg / EXECS) / 400);
323 GAUGER ("TRANSPORT","GLPK MLP 100 peers 400 addresses no optimization",
324 ((double) mlp_no_opt_avg / EXECS) / 400, "ms/address");
326 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
327 "MLP optimization average per address: %f\n",
328 ((double) mlp_with_opt_avg/ EXECS) / 400);
330 "GLPK MLP 100 peers 400 addresses with optimization",
331 ((double) mlp_with_opt_avg / EXECS) / 400, "ms/address");
332 (void) CLOSE (nullfd);
336 /* end of perf_transport_ats.c*/