'Adds a module to the chain.
Parameters
module : BaseModule
The new module to add.
kwargs : **keywords
All the keyword arguments are saved as meta information
for the added module. The currently known meta includes
- `take_labels`: indicating whether the module expect to
take labels when doing computation. Note any module in
the chain can take labels (not necessarily only the top
most one), and they all take the same labels passed
from the original data batch for the `SequentialModule`.
Returns
self
This function returns `self` to allow us to easily chain a
series of `add` calls.
Examples
>>> # An example of addinging two modules to a chain.
>>> seq_mod = mx.mod.SequentialModule()
>>> seq_mod.add(mod1)
>>> seq_mod.add(mod2)'

def add(self, module, **kwargs):

    self._modules.append(module)
    for key in kwargs:
        assert (key in self._meta_keys), ('Unknown    meta    "%s",    a    typo?' % key)
    self._metas.append(kwargs)
    self.binded = False
    self.params_initialized = False
    self.optimizer_initialized = False
    return self
