-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimulator.H
More file actions
129 lines (93 loc) · 2.95 KB
/
simulator.H
File metadata and controls
129 lines (93 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# ifndef SIMULATOR_H
# define SIMULATOR_H
# include <grid.H>
# include <minimum_deflection.H>
# include <sim_listener.H>
# include <configuration.H>
# include <fstream>
# include <gsl/gsl_rng.h>
# include <gsl/gsl_randist.h>
/**
* \brief Clase que modela al simulador.
* @authors Alejandro Mujica, Anna Lezama
*/
class Simulator
{
gsl_rng * rng;
bool __is_running;
unsigned long packages_counter;
unsigned long num_iterations;
size_t grid_width;
size_t grid_height;
DynDlist<Package> packages;
DynDlist<Grid::Node *> entrances;
DynDlist<Grid::Node *> exits;
DynDlist<Sim_Listener *> listeners;
Grid grid;
Statistics * statistics;
Configuration * conf;
void fire_event(const Event_Type &);
public:
Simulator();
~Simulator();
void add_entrance(Grid::Node *);
void remove_entrance(Grid::Node *);
void add_exit(Grid::Node *);
void remove_exit(Grid::Node *);
void move_packages();
/**
* Genera nuevos paquetes para entrar en la red.
*/
void generate_packages();
/**
* Mueve los paquetes desde la cola de entradas a la lista de clientes siempre que se pueda.
*/
void move_packages_from_queue_to_clients();
/**
* Incrementa el tiempo en cola de cada paquete que se encuentre en la cola de entrada de un nodo.
*/
void inc_tiq_to_packages();
/**
* Método plantilla que modela un paso de ejecuta la simulación.<br />
* Recibe como parámetro tipo el algoritmo de enrutamiento que se desea ejecutar el cual debe
* exportar lo siguiente
* <ul>
* <li> Routing_Algo::operator()(Grid & g, Grid::Node * node) que retorna void.
* Donde g es la Malla en la cual se está trabajando y node el nodo a que contiene los
* paquetes que se quieren enrutar.
* </ul>
*/
template <class /* Routing_Algo */>
void step();
void add_listener(Sim_Listener *);
Grid & get_grid() { return grid; }
bool is_running() const { return __is_running; }
DynDlist<Package> & get_packages_list() { return packages; }
};
template <class Routing_Algo>
void Simulator::step()
{
if (entrances.is_empty() or exits.is_empty())
throw std::logic_error("Debe seleccionar al menos un nodo entrada y una salida");
if (entrances.is_unitarian() and exits.is_unitarian() and entrances.get_first() == exits.get_first())
throw std::logic_error("De haber una sola entrada y salida deben ser diferentes");
statistics->clear();
statistics->init();
fire_event(Start);
for (int i = 0; i < num_iterations; ++i)
{
for (Grid::Node_Iterator it(grid); it.has_current(); it.next())
{
Grid::Node * curr_node = it.get_current();
Routing_Algo()(grid, curr_node);
}
move_packages();
move_packages_from_queue_to_clients();
generate_packages();
inc_tiq_to_packages();
statistics->inc_iterations();
}
statistics->count_deflections(packages);
fire_event(Stop);
}
# endif // SIMULATOR_H