"""
jaccard_distance.py
--------------

Graph distance based on the Jaccard index between edge sets.

author: David Saffo
email: saffo.d@husky.neu.edu
Submitted as part of the 2019 NetSI Collabathon.

"""

from .base import BaseDistance
from ..utilities import unweighted


class JaccardDistance(BaseDistance):
    """Jaccard distance between edge sets."""

    @unweighted
    def dist(self, G1, G2):
        r"""Compute the Jaccard index between two graphs.

        The Jaccard index between two sets

        .. math::
            J(A, B) = \frac{|A \cap B|}{|A \cup B|}

        provides a measure of similarity between sets. Here, we use the edge
        sets of two graphs. The index, a measure of similarity, is converted to
        a distance

        .. math::
            d_J(A, B) = 1 - J(A, B)

        for consistency with other graph distances.

        Parameters
        ----------

        G1, G2 (nx.Graph)
            two graphs to be compared.

        Returns
        -------

        dist (float)
            the distance between G1 and G2.

        """

        e1 = set(G1.edges)
        e2 = set(G2.edges)
        cup = set.union(e1, e2)
        cap = set.intersection(e1, e2)

        dist = 1 - len(cap) / len(cup)

        self.results["dist"] = dist
        return dist
