Adding a New Architecture

class SimplePSLLoRAModel(SimplePSLModel):

    def __init__(self, n_obj, n_var, lr=1e-3):
        super().__init__(n_obj, n_var)
        #n_obj (int): Number of objectives.
        #n_var (int): Number of variables.
        #lr (float, optional): Learning rate. Default is `1e-3`.
        self.lr = lr
        self.model = nn.Sequential(
            nn.Linear(n_obj, 64),
            nn.ReLU(),
            nn.Linear(64, n_var)
        )

    def forward(self, prefs):
        # Input: prefs (Tensor): Preference matrix of shape `(n_prob, n_obj)`.
        # Output: solution (Tensor): Solution matrix of shape `(n_prob, n_var)`.
        return self.model(prefs)

    def optimize(self, problem, epoch):
        # problem (ProblemClass): The problem class instance to optimize.
        # epoch (int): Number of epochs for optimization.
        optimizer = torch.optim.Adam(self.model.parameters(), lr=self.lr)
        criterion = nn.MSELoss()
        for _ in range(epoch):
            optimizer.zero_grad()
            prefs = problem.evaluate(self.forward)
            loss = criterion(prefs, problem.prefs)
            loss.backward()
            optimizer.step()

    def evaluate(self, prefs):
        # Input: prefs (Tensor): Preference matrix of shape `(n_prob, n_obj)`.
        #Output: decision_variables (Tensor): Decision variables of shape `(n_prob, n_var)`.
        return self.forward(prefs)