input: 
  import numpy as np
  class LinearRegressionModel:
      def __init__(self, input_dim, output_dim):
          ''' Initialises the weights and bias of the linear regression model
          Arguments:
              input_dim {int} -- Number of input features
              output_dim {int} -- Number of outputs
          '''
          self.weights = np.zeros((input_dim, output_dim))
          self.bias = np.zeros((1, output_dim))
  
      def forward(self, x):
          ''' Calculates the forward pass of the linear regression model
          Arguments:
              x {numpy array} -- Input data of size (N, input_dim)
          Returns:
              out {numpy array} -- Output of the linear regression model of size (N, output_dim)
          '''
          out = np.dot(x, self.weights) + self.bias
          return out
  
  # Example usage:
  # model = LinearRegressionModel(3, 1)
  # x = np.array([[1, 2, 3], [4, 5, 6]])
  # print(model.forward(x))  # Output should be a numpy array of shape (2, 1) filled with zeros
  
output:     def backward(self, x, y_true, y_pred, learning_rate):
          ''' Calculates the backward pass and updates the weights and bias of the linear regression model
          Arguments:
              x {numpy array} -- Input data of size (N, input_dim)
              y_true {numpy array} -- True labels of size (N, output_dim)
              y_pred {numpy array} -- Predicted labels of size (N, output_dim)
              learning_rate {float} -- Learning rate for weight updates
          '''
          error = y_pred - y_true
          d_weights = np.dot(x.T, error) / x.shape[0]
          d_bias = np.mean(error, axis=0, keepdims=True)
          self.weights -= learning_rate * d_weights
          self.bias -= learning_rate * d_bias