{"record":{"id":"4e4fd7703730d1aa","repo":"d2l-ai/d2l-zh","slug":"notimplementederror","errorCode":null,"errorMessage":"NotImplementedError","messagePattern":"NotImplementedError","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"d2l/mxnet.py","lineNumber":860,"sourceCode":"    text = preprocess_nmt(read_data_nmt())\n    source, target = tokenize_nmt(text, num_examples)\n    src_vocab = d2l.Vocab(source, min_freq=2,\n                          reserved_tokens=['<pad>', '<bos>', '<eos>'])\n    tgt_vocab = d2l.Vocab(target, min_freq=2,\n                          reserved_tokens=['<pad>', '<bos>', '<eos>'])\n    src_array, src_valid_len = build_array_nmt(source, src_vocab, num_steps)\n    tgt_array, tgt_valid_len = build_array_nmt(target, tgt_vocab, num_steps)\n    data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)\n    data_iter = d2l.load_array(data_arrays, batch_size)\n    return data_iter, src_vocab, tgt_vocab\n\nclass Encoder(nn.Block):\n    \"\"\"编码器-解码器架构的基本编码器接口\"\"\"\n    def __init__(self, **kwargs):\n        super(Encoder, self).__init__(**kwargs)\n\n    def forward(self, X, *args):\n        raise NotImplementedError\n\nclass Decoder(nn.Block):\n    \"\"\"编码器-解码器架构的基本解码器接口\n\n    Defined in :numref:`sec_encoder-decoder`\"\"\"\n    def __init__(self, **kwargs):\n        super(Decoder, self).__init__(**kwargs)\n\n    def init_state(self, enc_outputs, *args):\n        raise NotImplementedError\n\n    def forward(self, X, state):\n        raise NotImplementedError\n\nclass EncoderDecoder(nn.Block):\n    \"\"\"编码器-解码器架构的基类\n\n    Defined in :numref:`sec_encoder-decoder`\"\"\"","sourceCodeStart":842,"sourceCodeEnd":878,"githubUrl":"https://github.com/d2l-ai/d2l-zh/blob/e6b18ccea71451a55fcd861d7b96fddf2587b09a/d2l/mxnet.py#L842-L878","documentation":"NotImplementedError raised by Encoder.forward in d2l.mxnet (the base encoder interface for the encoder-decoder architecture, sec_encoder-decoder). Encoder is an abstract nn.Block subclass: instantiating it directly and calling it (or a subclass that fails to override forward) hits the guard. Every concrete encoder (Seq2SeqEncoder, etc.) must supply its own forward.","triggerScenarios":"e = d2l.Encoder(); e(X); or defining class MyEncoder(d2l.Encoder) with a typo in the method name (e.g. forward(self, x) lowercase mismatch is fine but hyphenated names like my_forward, or forgetting forward entirely) so the base implementation runs; also calling encoder(...) on an EncoderDecoder whose encoder member was accidentally set to the base class.","commonSituations":"Learners experimenting with the encoder-decoder chapter instantiate the interface to 'see what happens'; subclass method named `forwad` or defined outside the class body due to indentation mistakes; refactoring that replaces the concrete encoder with the base class during testing.","solutions":["Instantiate a concrete implementation, e.g. d2l.Seq2SeqEncoder(vocab_size, embed_size, num_hiddens, num_layers)","If subclassing, define forward(self, X, *args) with the exact name and correct indentation inside the class","Check the object you pass as encoder to EncoderDecoder is the concrete class, not d2l.Encoder","Add `import inspect; assert 'forward' in MyEncoder.__dict__` style checks in tests to catch un-overridden abstract methods early"],"exampleFix":"# before\nenc = d2l.Encoder()\nenc(X)  # NotImplementedError\n# after\nenc = d2l.Seq2SeqEncoder(vocab_size=10, embed_size=8, num_hiddens=16, num_layers=2)\nenc.initialize()\nenc(X)  # returns output, state\n# or subclass correctly\nclass MyEncoder(d2l.Encoder):\n    def forward(self, X, *args):\n        return X, None","handlingStrategy":"type-guard","validationCode":"import d2l\nenc = d2l.Encoder\nassert 'forward' in vars(enc) and getattr(enc, 'forward', None) is not d2l.Encoder.forward or enc is not d2l.Encoder, 'use a concrete Encoder subclass'","typeGuard":"def is_concrete_encoder(obj) -> bool:\n    return isinstance(obj, d2l.Encoder) and type(obj).forward is not d2l.Encoder.forward","tryCatchPattern":null,"preventionTips":["Never instantiate d2l.Encoder directly; use Seq2SeqEncoder or subclass it","After writing a subclass, grep for 'def forward' inside the class body","Run a one-batch encoder(X) smoke test right after construction","Match subclass base to the framework module (mxnet Block vs torch Module)"],"tags":["d2l","mxnet","not-implemented","abstract-class","encoder-decoder","inheritance"],"backgroundTag":null,"analyzedSha":"e6b18ccea71451a55fcd861d7b96fddf2587b09a","analyzedAt":"2026-08-14T20:05:26.414Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}