-
Notifications
You must be signed in to change notification settings - Fork 0
/
FinalMaxDelta.m
90 lines (85 loc) · 4.66 KB
/
FinalMaxDelta.m
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
function [complete_delta, delta_, repetition] = FinalMaxDelta(parametro, episode_lenght)
if parametro.frequency_interval == 0
parametro.frequency_interval = 999999; % Riconoscibile in modo da non fare il conto se on_interval non c'è
end
int = floor(episode_lenght /parametro.frequency_interval);
delta = zeros(int+1, 1);
% Primo indice corrisponde a condizione on_reset che sta nella prima riga
% di .dr_info
if parametro.dr_info(1, 2) == "additive" && parametro.dr_info(1, 3) == "gaussian"
if parametro.type == "angle"
delta(1) = VarToDelta_angoli(parametro.distribution_parameters(1,1));
elseif parametro.type == "general"
delta(1) = VarToDelta_generale(parametro.distribution_parameters(1,1));
end
elseif parametro.dr_info(1, 2) == "scaling" && parametro.dr_info(1, 3) == "uniform"
delta(1) = parametro.distribution_parameters(1,2); % MAX
elseif parametro.dr_info(1, 2) == "additive" && parametro.dr_info(1, 3) == "uniform"
if parametro.distribution_parameters(1,1) == - parametro.distribution_parameters(1,2) % usi un intervallo simmetrico
delta(1) = parametro.distribution_parameters(1,2);
else
if abs(parametro.distribution_parameters(1,1)) > abs(parametro.distribution_parameters(1,2))
segno = sign(parametro.distribution_parameters(1,1));
else
segno = sign(parametro.distribution_parameters(1,2));
end
delta(1) = segno* max(abs(parametro.distribution_parameters(1,1)),abs(parametro.distribution_parameters(1,2)));
end
elseif parametro.dr_info(1, 2) == "direct"
delta(1) = 0;
end
% Indici successivi corrispondono a condizione on_interval che sta nella seconda riga
% di .dr_info
for j = 1:int
if parametro.dr_info(2, 2) == "additive" && parametro.dr_info(2, 3) == "gaussian"
if parametro.type == "angle"
delta(j+1) = VarToDelta_angoli(parametro.distribution_parameters(2,1));
elseif parametro.type == "general"
delta(j+1) = VarToDelta_generale(parametro.distribution_parameters(2,1));
end
elseif parametro.dr_info(2, 2) == "scaling" && parametro.dr_info(2, 3) == "uniform"
delta(j+1) = parametro.distribution_parameters(2,2);
elseif parametro.dr_info(2, 2) == "additive" && parametro.dr_info(2, 3) == "uniform"
if parametro.distribution_parameters(2,1) == - parametro.distribution_parameters(2,2) % usi un intervallo simmetrico
delta(j+1) = parametro.distribution_parameters(2,2);
else
if abs(parametro.distribution_parameters(2,1)) > abs(parametro.distribution_parameters(2,2))
segno = sign(parametro.distribution_parameters(2,1));
else
segno = sign(parametro.distribution_parameters(2,2));
end
delta(j+1) = segno* max(abs(parametro.distribution_parameters(2,1)),abs(parametro.distribution_parameters(2,2)));
end
elseif parametro.dr_info(2, 2) == "direct"
delta(j+1) = 0;
end
end
if parametro.dr_info(2, 2) == "None" % Non c'è una randomizzazione on_interval
complete_delta = delta(1);
int = 0;
else
if parametro.dr_info(1, 2) == "additive" && (parametro.dr_info(1, 3) == "gaussian" || parametro.dr_info(1, 3) == "uniform")
if parametro.dr_info(2, 2) == "additive" && (parametro.dr_info(2, 3) == "gaussian" || parametro.dr_info(2, 3) == "uniform")
complete_delta = sum(delta, "all");
elseif parametro.dr_info(2, 2) == "scaling" && parametro.dr_info(2, 3) == "uniform"
complete_delta = delta(1)*delta(2:end); % sommi la perturbazione di on_reset e quelle on_interval scalano sul pertubato
end
elseif parametro.dr_info(1, 2) == "scaling" && parametro.dr_info(1, 3) == "uniform"
if parametro.dr_info(2, 2) == "scaling" && parametro.dr_info(2, 3) == "uniform"
complete_delta = prod(delta);
elseif parametro.dr_info(2, 2) == "additive" && (parametro.dr_info(2, 3) == "gaussian" || parametro.dr_info(2, 3) == "uniform")
complete_delta = delta(1)+delta(2:end);
end
elseif parametro.dr_info(1, 2) == "direct"
if parametro.dr_info(2, 2) == "scaling" && parametro.dr_info(2, 3) == "uniform"
complete_delta = prod(delta(2:end));
elseif parametro.dr_info(2, 2) == "additive" && (parametro.dr_info(2, 3) == "gaussian" || parametro.dr_info(2, 3) == "uniform")
complete_delta = sum(delta(2:end));
end
% elseif parametro.dr_info(1, 2) == "additive" && parametro.dr_info(1, 3) == "uniform"
% complete_delta = sum(delta, "all");
end
end
delta_ = delta(:,:);
repetition = int;
end