26 template<
typename AFloat>
 
   27 auto TCpu<AFloat>::RecurrentLayerBackward(TCpuMatrix<AFloat> & state_gradients_backward, 
 
   28                                           TCpuMatrix<AFloat> & input_weight_gradients,
 
   29                                           TCpuMatrix<AFloat> & state_weight_gradients,
 
   30                                           TCpuMatrix<AFloat> & bias_gradients,
 
   31                                           TCpuMatrix<AFloat> & df, 
 
   32                                           const TCpuMatrix<AFloat> & state, 
 
   33                                           const TCpuMatrix<AFloat> & weights_input, 
 
   34                                           const TCpuMatrix<AFloat> & weights_state, 
 
   35                                           const TCpuMatrix<AFloat> & input,  
 
   36                                           TCpuMatrix<AFloat> & input_gradient)
 
   37 -> TCpuMatrix<AFloat> &
 
   51    if (input_gradient.GetNoElements() > 0) Multiply(input_gradient, df, weights_input);
 
   54    if (state_gradients_backward.GetNoElements() > 0) Multiply(state_gradients_backward, df, weights_state);
 
   61    if (input_weight_gradients.GetNoElements() > 0) {
 
   62       TransposeMultiply(input_weight_gradients, df, input, 1. , 1.); 
 
   64    if (state_weight_gradients.GetNoElements() > 0) {
 
   65       TransposeMultiply(state_weight_gradients, df, state, 1. , 1. ); 
 
   69    if (bias_gradients.GetNoElements() > 0) {
 
   70       SumColumns(bias_gradients, df, 1., 1.);  
 
   80    return input_gradient;