def METHOD_NAME(self, x: PaddedBatch, h_0: torch.Tensor = None):
    """
    :param x:
    :param h_0: None or [1, B, H] float tensor
                0.0 values in all components of hidden state of specific client means no-previous state and
                use starter for this client
                h_0 = None means no-previous state for all clients in batch
    :return:
    """
    shape = x.payload.size()
    assert shape[1] > 0, "Batch can'not have 0 transactions"
    # prepare initial state
    if self.trainable_starter == 'static':
        num_dir = 2 if self.bidirectional else 1
        starter_h = torch.tanh(self.starter_h.expand(self.num_layers * num_dir, shape[0], -1).contiguous())
        if h_0 is None:
            h_0 = starter_h
        elif h_0 is not None and not self.training:
            h_0 = torch.where(
                (h_0.squeeze(0).abs().sum(dim=1) == 0.0).unsqueeze(0).unsqueeze(2).expand(*starter_h.size()),
                starter_h,
                h_0,
            )
        else:
            raise NotImplementedError('Unsupported mode: cannot mix fixed X and learning Starter')
    # pass-through rnn
    if self.rnn_type == 'lstm':
        out, _ = self.rnn(x.payload)
    elif self.rnn_type == 'gru':
        out, _ = self.rnn(x.payload, h_0)
    else:
        raise Exception(f'wrong rnn type "{self.rnn_type}"')
    out = PaddedBatch(out, x.seq_lens)
    if self.is_reduce_sequence:
        return self.reducer(out)
    return out