23
23
log_bcjr_base::log_bcjr_base (int I, int S, int O,
24
24
const std::vector<int > &NS,
25
25
const std::vector<int > &OS)
26
- : d_I(I), d_S(S), d_O(O)
26
+ : d_I(I), d_S(S), d_O(O), d_ordered_OS(S*I)
27
27
{
28
28
if (NS.size () != S*I) {
29
29
throw std::runtime_error (" Invalid size for NS." );
@@ -36,6 +36,14 @@ log_bcjr_base::log_bcjr_base(int I, int S, int O,
36
36
d_OS = OS;
37
37
38
38
generate_PS_PI ();
39
+
40
+ // Compute ordered_OS
41
+ std::vector<int >::iterator ordered_OS_it = d_ordered_OS.begin ();
42
+ for (int s=0 ; s < S ; ++s) {
43
+ for (size_t i=0 ; i<(d_PS[s]).size () ; ++i) {
44
+ *(ordered_OS_it++) = OS[d_PS[s][i]*I + d_PI[s][i]];
45
+ }
46
+ }
39
47
}
40
48
41
49
void
@@ -69,7 +77,7 @@ log_bcjr_base::compute_fw_metrics(const std::vector<float> &G,
69
77
70
78
float norm_A = -std::numeric_limits<float >::max ();
71
79
std::vector<float >::iterator A_prev, A_curr;
72
- std::vector<int >::iterator PS_it, PI_it ;
80
+ std::vector<int >::iterator PS_it, ordered_OS_it ;
73
81
74
82
// Integrate initial forward metrics
75
83
std::copy (A0.begin (), A0.end (), A.begin ());
@@ -80,19 +88,18 @@ log_bcjr_base::compute_fw_metrics(const std::vector<float> &G,
80
88
for (std::vector<float >::const_iterator G_k = G.begin () ;
81
89
G_k != G.end () ; G_k += d_O) {
82
90
91
+ ordered_OS_it = d_ordered_OS.begin ();
83
92
for (int s=0 ; s < d_S ; ++s) {
84
93
// Iterators for previous state and previous input lists
85
94
PS_it=d_PS[s].begin ();
86
- PI_it=d_PI[s].begin ();
87
95
88
96
// Loop
89
97
for (size_t i=0 ; i<(d_PS[s]).size () ; ++i) {
98
+ // Equivalent to:
99
+ // *A_curr = _max_star(*A_curr,
100
+ // A_prev[PS[s][i]] + G_k[d_OS[PS[s][i]*I + PI[s][i]]);
90
101
*A_curr = _max_star (*A_curr,
91
- A_prev[*PS_it] + G_k[d_OS[(*PS_it)*d_I + (*PI_it)]]);
92
-
93
- // Update PS/PI iterators
94
- ++PS_it;
95
- ++PI_it;
102
+ A_prev[*(PS_it++)] + G_k[*(ordered_OS_it++)]);
96
103
}
97
104
98
105
// Update iterators
@@ -135,11 +142,7 @@ log_bcjr_base::compute_bw_metrics(const std::vector<float> &G,
135
142
// Loop
136
143
for (size_t i=0 ; i < d_I ; ++i) {
137
144
*B_curr = _max_star (*B_curr,
138
- B_next[(d_S-1 )-*NS_it] + G_k[(d_O-1 )-*OS_it]);
139
-
140
- // Update PS/PI iterators
141
- ++NS_it;
142
- ++OS_it;
145
+ B_next[(d_S-1 )-*(NS_it++)] + G_k[(d_O-1 )-*(OS_it++)]);
143
146
}
144
147
145
148
// Update iterators
0 commit comments