paragraph for gnunet devs that don't know how to use the web
[oweals/gnunet.git] / src / ats / gnunet-ats-solver-eval.h
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2010-2013 GNUnet e.V.
4
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9
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  Affero General Public License for more details.
14
15  You should have received a copy of the GNU Affero General Public License
16  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 /**
19  * @file ats-tests/ats-testing-experiment.c
20  * @brief ats benchmark: controlled experiment execution
21  * @author Christian Grothoff
22  * @author Matthias Wachs
23  */
24 #ifndef GNUNET_ATS_SOLVER_EVAL_H
25 #define GNUNET_ATS_SOLVER_EVAL_H
26
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
29 #include "gnunet_ats_plugin.h"
30 #include "gnunet_ats_service.h"
31 #include "gnunet-service-ats_addresses.h"
32 #include "gnunet-service-ats_normalization.h"
33 #include "test_ats_api_common.h"
34
35 enum GeneratorType
36 {
37   GNUNET_ATS_TEST_TG_LINEAR,
38   GNUNET_ATS_TEST_TG_CONSTANT,
39   GNUNET_ATS_TEST_TG_RANDOM,
40   GNUNET_ATS_TEST_TG_SINUS
41 };
42
43
44 enum OperationType
45 {
46   SOLVER_OP_ADD_ADDRESS,
47   SOLVER_OP_DEL_ADDRESS,
48   SOLVER_OP_START_SET_PROPERTY,
49   SOLVER_OP_STOP_SET_PROPERTY,
50   SOLVER_OP_START_SET_PREFERENCE,
51   SOLVER_OP_STOP_SET_PREFERENCE,
52   SOLVER_OP_START_REQUEST,
53   SOLVER_OP_STOP_REQUEST,
54 };
55
56 struct SolverHandle
57 {
58   /**
59    * Solver plugin name
60    */
61   char *plugin;
62
63   /**
64    * Solver environment
65    */
66   struct GNUNET_ATS_PluginEnvironment env;
67
68   /**
69    * Solver handle
70    */
71   struct GNUNET_ATS_SolverFunctions *sf;
72
73   /**
74    * Address hashmap
75    */
76   struct GNUNET_CONTAINER_MultiPeerMap *addresses;
77 };
78
79 enum GNUNET_ATS_Solvers
80 {
81   GNUNET_ATS_SOLVER_PROPORTIONAL,
82   GNUNET_ATS_SOLVER_MLP,
83   GNUNET_ATS_SOLVER_RIL,
84 };
85
86 struct LoggingFileHandle
87 {
88   /* DLL list for logging time steps */
89   struct LoggingFileHandle *next;
90   struct LoggingFileHandle *prev;
91
92   /* peer id */
93   long long unsigned int pid;
94
95   /* address id */
96   long long unsigned int aid;
97
98   struct GNUNET_DISK_FileHandle *f_hd;
99
100 };
101
102 struct LoggingTimeStep
103 {
104   struct LoggingTimeStep *prev;
105   struct LoggingTimeStep *next;
106
107   struct LoggingPeer *head;
108   struct LoggingPeer *tail;
109
110   struct GNUNET_TIME_Absolute timestamp;
111   struct GNUNET_TIME_Relative delta;
112 };
113
114 struct LoggingPeer
115 {
116   struct LoggingPeer *prev;
117   struct LoggingPeer *next;
118
119   long long unsigned int id;
120   struct GNUNET_PeerIdentity peer_id;
121   double pref_abs[GNUNET_ATS_PREFERENCE_END];
122   double pref_norm[GNUNET_ATS_PREFERENCE_END];
123   int is_requested;
124
125   struct LoggingAddress *addr_head;
126   struct LoggingAddress *addr_tail;
127 };
128
129 struct LoggingAddress
130 {
131   struct LoggingAddress *next;
132   struct LoggingAddress *prev;
133
134   long long unsigned int aid;
135   int active;
136   uint32_t network;
137   uint32_t assigned_bw_in;
138   uint32_t assigned_bw_out;
139
140   double prop_abs[GNUNET_ATS_PropertyCount];
141   double prop_norm[GNUNET_ATS_PropertyCount];
142 };
143
144
145 struct TestPeer
146 {
147   struct TestPeer *prev;
148   struct TestPeer *next;
149
150
151   long long unsigned int id;
152   int is_requested;
153   struct GNUNET_PeerIdentity peer_id;
154
155   double pref_abs[GNUNET_ATS_PreferenceCount];
156   double pref_norm[GNUNET_ATS_PreferenceCount];
157
158   uint32_t assigned_bw_in;
159   uint32_t assigned_bw_out;
160
161   struct TestAddress *addr_head;
162   struct TestAddress *addr_tail;
163 };
164
165
166 struct TestAddress
167 {
168   struct TestAddress *next;
169   struct TestAddress *prev;
170
171   long long unsigned int aid;
172   struct ATS_Address *ats_addr;
173   uint32_t network;
174
175   double prop_abs[GNUNET_ATS_PropertyCount];
176   double prop_norm[GNUNET_ATS_PropertyCount];
177 };
178
179 struct Episode;
180
181 struct Experiment;
182
183 typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) (
184     struct Episode *e);
185
186 typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment *e,
187     struct GNUNET_TIME_Relative duration,int success);
188
189 /**
190  * An operation in an experiment
191  */
192 struct GNUNET_ATS_TEST_Operation
193 {
194   struct GNUNET_ATS_TEST_Operation *next;
195   struct GNUNET_ATS_TEST_Operation *prev;
196
197   long long unsigned int address_id;
198   long long unsigned int peer_id;
199   long long unsigned int client_id;
200
201   long long unsigned int address_session;
202   unsigned int address_network;
203   char*address;
204   char*plugin;
205
206
207   long long unsigned int base_rate;
208   long long unsigned int max_rate;
209   struct GNUNET_TIME_Relative period;
210   struct GNUNET_TIME_Relative frequency;
211   struct GNUNET_TIME_Relative feedback_delay;
212
213   enum OperationType type;
214   enum GeneratorType gen_type;
215   enum GNUNET_ATS_PreferenceKind pref_type;
216   // enum GNUNET_ATS_Property prop_type;
217 };
218
219 struct Episode
220 {
221   int id;
222   struct Episode *next;
223   struct GNUNET_TIME_Relative duration;
224
225   struct GNUNET_ATS_TEST_Operation *head;
226   struct GNUNET_ATS_TEST_Operation *tail;
227 };
228
229 struct LoggingHandle
230 {
231   struct GNUNET_SCHEDULER_Task * logging_task;
232   struct GNUNET_TIME_Relative log_freq;
233
234   /* DLL list for logging time steps */
235   struct LoggingTimeStep *head;
236   struct LoggingTimeStep *tail;
237 };
238
239 struct Experiment
240 {
241   char *name;
242   char *log_prefix;
243   char *cfg_file;
244   char *log_output_dir;
245   int log_append_time_stamp;
246
247   struct GNUNET_TIME_Relative log_freq;
248   struct GNUNET_TIME_Relative max_duration;
249   struct GNUNET_TIME_Relative total_duration;
250   struct GNUNET_TIME_Absolute start_time;
251   unsigned int num_episodes;
252   struct Episode *start;
253
254   struct GNUNET_CONFIGURATION_Handle *cfg;
255
256   struct GNUNET_SCHEDULER_Task * experiment_timeout_task;
257   struct GNUNET_SCHEDULER_Task * episode_timeout_task;
258   struct Episode *cur;
259
260   GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
261   GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb;
262 };
263
264 struct PreferenceGenerator
265 {
266   struct PreferenceGenerator *prev;
267   struct PreferenceGenerator *next;
268
269   enum GeneratorType type;
270
271   long long unsigned int peer;
272   unsigned int client_id;
273
274   enum GNUNET_ATS_PreferenceKind kind;
275
276   long int base_value;
277   long int max_value;
278   struct GNUNET_TIME_Relative duration_period;
279   struct GNUNET_TIME_Relative frequency;
280   struct GNUNET_TIME_Relative feedback_frequency;
281
282   struct GNUNET_SCHEDULER_Task * set_task;
283   struct GNUNET_SCHEDULER_Task * feedback_task;
284   struct GNUNET_TIME_Absolute next_ping_transmission;
285   struct GNUNET_TIME_Absolute time_start;
286
287
288   /* Feedback */
289   uint32_t feedback_bw_out_acc;
290   uint32_t feedback_bw_in_acc;
291   uint32_t feedback_delay_acc;
292
293   double pref_bw_old;
294   double pref_latency_old;
295
296   struct GNUNET_TIME_Absolute feedback_last;
297
298   struct GNUNET_TIME_Absolute feedback_last_bw_update;
299   struct GNUNET_TIME_Absolute feedback_last_delay_update;
300   uint32_t last_assigned_bw_in;
301   uint32_t last_assigned_bw_out;
302   double last_delay_value;
303
304 };
305
306
307 struct PropertyGenerator
308 {
309   struct PropertyGenerator *prev;
310   struct PropertyGenerator *next;
311
312   enum GeneratorType type;
313
314   long long unsigned int peer;
315   long long unsigned int address_id;
316
317   struct TestPeer *test_peer;
318   struct TestAddress *test_address;
319   uint32_t ats_property;
320
321   long int base_value;
322   long int max_value;
323   struct GNUNET_TIME_Relative duration_period;
324   struct GNUNET_TIME_Relative frequency;
325
326   struct GNUNET_SCHEDULER_Task * set_task;
327   struct GNUNET_TIME_Absolute next_ping_transmission;
328   struct GNUNET_TIME_Absolute time_start;
329 };
330
331 #endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */
332 /* end of file ats-testing.h */