code: def _propagate_param_grad(self, parray, garray):
          
          #if self.param_array.size != self.size:
          #    self._param_array_ = np.empty(self.size, dtype=np.float64)
          #if self.gradient.size != self.size:
          #    self._gradient_array_ = np.empty(self.size, dtype=np.float64)
  
          pi_old_size = 0
          for pi in self.parameters:
              pislice = slice(pi_old_size, pi_old_size + pi.size)
  
              self.param_array[pislice] = pi.param_array.flat  # , requirements=['C', 'W']).flat
              self.gradient_full[pislice] = pi.gradient_full.flat  # , requirements=['C', 'W']).flat
  
              pi.param_array.data = parray[pislice].data
              pi.gradient_full.data = garray[pislice].data
  
              pi._propagate_param_grad(parray[pislice], garray[pislice])
              pi_old_size += pi.size
  
          self._model_initialized_ = True
docs: For propagating the param_array and gradient_array.
          This ensures the in memory view of each subsequent array.
  
          1.) connect param_array of children to self.param_array
          2.) tell all children to propagate further