def METHOD_NAME(
    self,
    log: DataFrame,
    user_features: Optional[DataFrame] = None,
    item_features: Optional[DataFrame] = None,
) -> None:
    self.logger.debug("Fitting ADMM SLIM")
    pandas_log = log.select("user_idx", "item_idx", "relevance").toPandas()
    interactions_matrix = csr_matrix(
        (
            pandas_log["relevance"],
            (pandas_log["user_idx"], pandas_log["item_idx"]),
        ),
        shape=(self._user_dim, self._item_dim),
    )
    self.logger.debug("Gram matrix")
    xtx = (interactions_matrix.T @ interactions_matrix).toarray()
    self.logger.debug("Inverse matrix")
    inv_matrix = np.linalg.inv(
        xtx + (self.lambda_2 + self.rho) * np.eye(self._item_dim)
    )
    self.logger.debug("Main calculations")
    p_x = inv_matrix @ xtx
    mat_b, mat_c, mat_gamma = self._init_matrix(self._item_dim)
    r_primal = np.linalg.norm(mat_b - mat_c)
    r_dual = np.linalg.norm(self.rho * mat_c)
    eps_primal, eps_dual = 0.0, 0.0
    iteration = 0
    while (
        r_primal > eps_primal or r_dual > eps_dual
    ) and iteration < self.max_iteration:
        iteration += 1
        (
            mat_b,
            mat_c,
            mat_gamma,
            self.rho,
            r_primal,
            r_dual,
            eps_primal,
            eps_dual,
        ) = _main_iteration(
            inv_matrix,
            p_x,
            mat_b,
            mat_c,
            mat_gamma,
            self.rho,
            self.eps_abs,
            self.eps_rel,
            self.lambda_1,
            self._item_dim,
            self.threshold,
            self.multiplicator,
        )
        result_message = (
            f"Iteration: {iteration}. primal gap: "
            f"{r_primal - eps_primal:.5}; dual gap: "
            f" {r_dual - eps_dual:.5}; rho: {self.rho}"
        )
        self.logger.debug(result_message)
    mat_c_sparse = coo_matrix(mat_c)
    mat_c_pd = pd.DataFrame(
        {
            "item_idx_one": mat_c_sparse.row.astype(np.int32),
            "item_idx_two": mat_c_sparse.col.astype(np.int32),
            "similarity": mat_c_sparse.data,
        }
    )
    self.similarity = State().session.createDataFrame(
        mat_c_pd,
        schema="item_idx_one int, item_idx_two int, similarity double",
    )
    self.similarity.cache().count()