@@ -21,10 +21,86 @@ class HiddenStates
2121 _layer_views.resize (num_layers);
2222 }
2323
24- HiddenStates (const HiddenStates& src) = default ;
25- HiddenStates (HiddenStates&& src) noexcept = default ;
26- HiddenStates& operator =(HiddenStates&& src) noexcept = default ;
27- HiddenStates& operator =(const HiddenStates& src) = default ;
24+ HiddenStates (const HiddenStates& src) :
25+ _topology (src._topology),
26+ _pre_activation_sums (src._pre_activation_sums),
27+ _hidden_state_values (src._hidden_state_values),
28+ _cell_state_values (src._cell_state_values)
29+ {
30+ MYODDWEB_PROFILE_FUNCTION (" HiddenStates" );
31+ rebuild_views ();
32+ }
33+
34+ HiddenStates (HiddenStates&& src) noexcept :
35+ _topology (std::move(src._topology)),
36+ _pre_activation_sums (std::move(src._pre_activation_sums)),
37+ _hidden_state_values (std::move(src._hidden_state_values)),
38+ _cell_state_values (std::move(src._cell_state_values))
39+ {
40+ MYODDWEB_PROFILE_FUNCTION (" HiddenStates" );
41+ rebuild_views ();
42+ }
43+
44+ HiddenStates& operator =(const HiddenStates& src)
45+ {
46+ MYODDWEB_PROFILE_FUNCTION (" HiddenStates" );
47+ if (this != &src)
48+ {
49+ _topology = src._topology ;
50+ _pre_activation_sums = src._pre_activation_sums ;
51+ _hidden_state_values = src._hidden_state_values ;
52+ _cell_state_values = src._cell_state_values ;
53+ rebuild_views ();
54+ }
55+ return *this ;
56+ }
57+
58+ HiddenStates& operator =(HiddenStates&& src) noexcept
59+ {
60+ MYODDWEB_PROFILE_FUNCTION (" HiddenStates" );
61+ if (this != &src)
62+ {
63+ _topology = std::move (src._topology );
64+ _pre_activation_sums = std::move (src._pre_activation_sums );
65+ _hidden_state_values = std::move (src._hidden_state_values );
66+ _cell_state_values = std::move (src._cell_state_values );
67+ rebuild_views ();
68+ }
69+ return *this ;
70+ }
71+
72+ void rebuild_views ()
73+ {
74+ MYODDWEB_PROFILE_FUNCTION (" HiddenStates" );
75+ _layer_views.clear ();
76+ const size_t num_layers = _topology.size ();
77+ _layer_views.resize (num_layers);
78+
79+ for (size_t layer_number = 0 ; layer_number < num_layers; ++layer_number)
80+ {
81+ const size_t n = _topology[layer_number];
82+ if (n == 0 ) continue ;
83+
84+ const size_t total_hid = _hidden_state_values[layer_number].size ();
85+ const size_t num_time_steps = total_hid / n;
86+ if (num_time_steps == 0 ) continue ;
87+
88+ const size_t total_pre = _pre_activation_sums[layer_number].size ();
89+ const unsigned multiplier = static_cast <unsigned >(total_pre / (num_time_steps * n));
90+
91+ auto & views = _layer_views[layer_number];
92+ views.reserve (num_time_steps);
93+
94+ double * p_pre = _pre_activation_sums[layer_number].data ();
95+ double * p_hid = _hidden_state_values[layer_number].data ();
96+ double * p_cel = _cell_state_values[layer_number].data ();
97+
98+ for (size_t t = 0 ; t < num_time_steps; ++t)
99+ {
100+ views.emplace_back (&p_pre[t * n * multiplier], &p_hid[t * n], &p_cel[t * n], static_cast <unsigned >(n), static_cast <unsigned >(n * multiplier));
101+ }
102+ }
103+ }
28104
29105 void zero ()
30106 {
0 commit comments