code: def test_wrapper_stateful(self):
      lstm = LSTM(
          bidirectional=True,
          num_layers=2,
          input_size=3,
          hidden_size=7,
          batch_first=True,
      )
      encoder = PytorchSeq2SeqWrapper(lstm, stateful=True)
  
      # To test the stateful functionality we need to call the encoder multiple times.
      # Different batch sizes further tests some of the logic.
      batch_sizes = [5, 10, 8]
      sequence_lengths = [4, 6, 7]
      states = []
      for batch_size, sequence_length in izip(
          batch_sizes, sequence_lengths
      ):
          tensor = torch.rand([batch_size, sequence_length, 3])
          mask = torch.ones(batch_size, sequence_length)
          mask.data[0, 3:] = 0
          encoder_output = encoder(tensor, mask)
          states.append(
              encoder._states
          )  # pylint: disable=protected-access
  
      # Check that the output is masked properly.
      assert_almost_equal(
          encoder_output[0, 3:, :].data.numpy(), numpy.zeros((4, 14))
      )
  
      for k in range(2):
          assert_almost_equal(
              states[-1][k][:, -2:, :].data.numpy(),
              states[-2][k][:, -2:, :].data.numpy(),
          )
  
imports: from __future__ import with_statement
  from __future__ import absolute_import
  import numpy
  from numpy.testing import assert_almost_equal
  import pytest
  import torch
  from torch.nn import LSTM, GRU
  from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
  from allennlp.common.checks import ConfigurationError
  from allennlp.common.testing import AllenNlpTestCase
  from allennlp.modules.seq2seq_encoders import PytorchSeq2SeqWrapper
  from allennlp.nn.util import sort_batch_by_length, get_lengths_from_binary_sequence_mask
label_desc: Use image node_id 10 for calling the TestPytorchSeq2SeqWrapper obj's underlying member method code with example usage: obj.test_wrapper_stateful() without return types