This rule raises an issue when a class is a Pytorch module and does not call the `++super().__init__()++` method in its constructor.

== Why is this an issue?

To provide the AutoGrad functionality, the Pytorch library needs to set up the necessary data structures in the base class. If the `++super().__init__()++` method is not called, the module will not be able to keep track of its parameters and other attributes.

For example, when trying to instantiate a module like `nn.Linear` without calling the `++super().__init__()++` method, the instantiation will fail when it tries to register it as a submodule of the parent module.

[source, python]
----
import torch.nn as nn

class MyCustomModule(nn.Module):
    def __init__(self, input_size, output_size):
        self.fc = nn.Linear(input_size, output_size) 

model = MyCustomModule(10, 5) # AttributeError: cannot assign module before Module.__init__() call
----


== How to fix it
Add a call to `++super().__init__()++` at the beginning of the constructor of the class.

=== Code examples

==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
import torch.nn as nn

class MyCustomModule(nn.Module):
    def __init__(self, input_size, output_size):
        self.fc = nn.Linear(input_size, output_size) # Noncompliant: creating an nn.Linear without calling super().__init__()
----

==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
import torch.nn as nn

class MyCustomModule(nn.Module):
    def __init__(self, input_size, output_size):
        super().__init__()
        self.fc = nn.Linear(input_size, output_size)
----

== Resources
=== Documentation

* Pytorch documentation - https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module[torch.nn.Module]


ifdef::env-github,rspecator-view[]

(visible only on this page)

== Implementation specification 

Verify that subclasses of `torch.nn.Module` call the `++super().__init__()++` method in their constructor.
It also applies to classes that inherit from a class that inherits from `torch.nn.Module`.

=== Message 

Primary : Add a call to `++super().__init__()++`

Secondary : Inheritance happens here

=== Issue location

Primary : First line of the constructor

Secondary : (The inheritance position of the class)

=== Quickfix

Add a call to `++super().__init__()++` at the beginning of the constructor.
If direct child of `torch.nn.Module`, easy, no need to try to add parameters.
If indirect, try to find the parameters and match them with the same name ? Or abort if too complicatted.

endif::env-github,rspecator-view[]
