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