Update reviewers' anomalous scores and products' summaries.

        The update consists of 2 steps;

        Step1 (updating summaries):
            Update summaries of products with anomalous scores of reviewers
            and weight function. The weight is calculated by the manner in
            :class:`ria.bipartite.BipartiteGraph`.

        Step2 (updating anomalous scores):
            Update its anomalous score of each reviewer by computing the summation
            of deviation times credibility.
            See :meth:`Reviewer.update_anomalous_score` for more details.
            After that those updated anomalous scores are normalized so that
            every value is in :math:`[0, 1]`.

        Returns:
          maximum absolute difference between old summary and new one, and
            old anomalous score and new one. This value is not normalized and
            thus it may be grater than actual normalized difference.

def update(self):
        """ Update reviewers' anomalous scores and products' summaries.

        The update consists of 2 steps;

        Step1 (updating summaries):
            Update summaries of products with anomalous scores of reviewers
            and weight function. The weight is calculated by the manner in
            :class:`ria.bipartite.BipartiteGraph`.

        Step2 (updating anomalous scores):
            Update its anomalous score of each reviewer by computing the summation
            of deviation times credibility.
            See :meth:`Reviewer.update_anomalous_score` for more details.
            After that those updated anomalous scores are normalized so that
            every value is in :math:`[0, 1]`.

        Returns:
          maximum absolute difference between old summary and new one, and
            old anomalous score and new one. This value is not normalized and
            thus it may be grater than actual normalized difference.
        """
        res = super(BipartiteGraph, self).update()

        max_v = None
        min_v = float("inf")
        for r in self.reviewers:
            max_v = max(max_v, r.anomalous_score)
            min_v = min(min_v, r.anomalous_score)

        width = max_v - min_v
        if width:
            for r in self.reviewers:
                r.anomalous_score = (r.anomalous_score - min_v) / width

        return res