docs: def _update_message(self, sending_cluster):
  
          """
          This is the message-update method.
  
          Parameters
          ----------
          sending_cluster: The resulting messages are lambda_{c-->s} from the given
              cluster 'c' to all of its intersection_sets 's'.
              Here 's' are the elements of intersection_sets_for_cluster_c.
  
          Reference
          ---------
          Fixing Max-Product: Convergent Message-Passing Algorithms for MAP LP Relaxations
          by Amir Globerson and Tommi Jaakkola.
          Section 6, Page: 5; Beyond pairwise potentials: Generalized MPLP
          Later Modified by Sontag in "Introduction to Dual decomposition for Inference" Pg: 7 & 17
          """
  
          # The new updates will take place for the intersection_sets of this cluster.
          # The new updates are:
          # \delta_{f \rightarrow i}(x_i) = - \delta_i^{-f} +
          # 1/{\| f \|} max_{x_{f-i}}\left[{\theta_f(x_f) + \sum_{i' in f}{\delta_{i'}^{-f}}(x_i')} \right ]
  
          # Step. 1) Calculate {\theta_f(x_f) + \sum_{i' in f}{\delta_{i'}^{-f}}(x_i')}
          objective_cluster = self.objective[sending_cluster.cluster_variables]
          for current_intersect in sending_cluster.intersection_sets_for_cluster_c:
              objective_cluster += self.objective[current_intersect]
  
          updated_results = []
          objective = []
          for current_intersect in sending_cluster.intersection_sets_for_cluster_c:
              # Step. 2) Maximize step.1 result wrt variables present in the cluster but not in the current intersect.
              phi = objective_cluster.maximize(list(sending_cluster.cluster_variables - current_intersect),
                                               inplace=False)
  
              # Step. 3) Multiply 1/{\| f \|}
              intersection_length = len(sending_cluster.intersection_sets_for_cluster_c)
              phi *= (1 / intersection_length)
              objective.append(phi)
  
              # Step. 4) Subtract \delta_i^{-f}
              # These are the messages not emanating from the sending cluster but going into the current intersect.
              # which is = Objective[current_intersect_node] - messages from the cluster to the current intersect node.
              updated_results.append(phi + -1 * (self.objective[current_intersect] + -1 * sending_cluster.
                                                 message_from_cluster[current_intersect]))
  
          # This loop is primarily for simultaneous updating:
          # 1. This cluster's message to each of the intersects.
          # 2. The value of the Objective for intersection_nodes.
          index = -1
          cluster_potential = copy.deepcopy(sending_cluster.cluster_potential)
          for current_intersect in sending_cluster.intersection_sets_for_cluster_c:
              index += 1
              sending_cluster.message_from_cluster[current_intersect] = updated_results[index]
              self.objective[current_intersect] = objective[index]
              cluster_potential += (-1) * updated_results[index]
  
          # Here we update the Objective for the current factor.
          self.objective[sending_cluster.cluster_variables] = cluster_potential