Source code for skfuzzy.fuzzymath.fuzzy_logic

"""
fuzzy_logic.py : General logical operations on fuzzy membership functions,
                 a.k.a. fuzzy sets.
"""
import numpy as np


def _resampleuniverse(x, mfx, y, mfy):
    """
    Resamples fuzzy universes `x` and `y` to include the full range of either
    universe, with resolution of the lowest difference between any two
    reported points.

    """
    minstep = np.asarray([np.diff(x).min(), np.diff(y).min()]).min()

    mi = min(x.min(), y.min())
    ma = max(x.max(), y.max())
    z = np.r_[mi:ma:minstep]

    xidx = np.argsort(x)
    mfx = mfx[xidx]
    x = x[xidx]
    mfx2 = np.interp(z, x, mfx)

    yidx = np.argsort(y)
    mfy = mfy[yidx]
    y = y[yidx]
    mfy2 = np.interp(z, y, mfy)

    return z, mfx2, mfy2


def fuzzy_norm(x, mfx, y, mfy, norm):
    """
    Fuzzy operator, logic operatrion of two fuzzy sets.

    Parameters
    ----------
    x : 1d array
        Universe variable for fuzzy membership function `mfx`.
    mfx : 1d array
        Fuzzy membership function for universe variable `x`.
    y : 1d array
        Universe variable for fuzzy membership function `mfy`.
    mfy : 1d array
        Fuzzy membership function for universe variable `y`.
    norm : Function
        T-norm or T-conorm (S-norm)

    Returns
    -------
    z : 1d array
        Universe variable for union of the two provided fuzzy sets.
    mfz : 1d array
        Fuzzy membership function, the result of the operation
        of `mfx` and `mfy`.

    Notes
    -------
    See `T-Norm <https://en.wikipedia.org/wiki/T-norm>`_ for t-norms.

    """
    # Check if universes are the same
    sameuniverse = False
    if x.shape == y.shape and (x == y).all():
        z = x
        mfx2 = mfx
        mfy2 = mfy
        sameuniverse = True

    if not sameuniverse:
        z, mfx2, mfy2 = _resampleuniverse(x, mfx, y, mfy)

    return z, norm(mfx2, mfy2)


[docs]def fuzzy_and(x, mfx, y, mfy): """ Fuzzy AND operator, a.k.a. the intersection of two fuzzy sets. Parameters ---------- x : 1d array Universe variable for fuzzy membership function `mfx`. mfx : 1d array Fuzzy membership function for universe variable `x`. y : 1d array Universe variable for fuzzy membership function `mfy`. mfy : 1d array Fuzzy membership function for universe variable `y`. Returns ------- z : 1d array Universe variable for union of the two provided fuzzy sets. mfz : 1d array Fuzzy AND (intersection) of `mfx` and `mfy`. """ # Check if universes are the same return fuzzy_norm(x, mfx, y, mfy, norm=np.fmin)
[docs]def fuzzy_or(x, mfx, y, mfy): """ Fuzzy OR operator, a.k.a. union of two fuzzy sets. Parameters ---------- x : 1d array Universe variable for fuzzy membership function `mfx`. mfx : 1d array Fuzzy membership function for universe variable `x`. y : 1d array Universe variable for fuzzy membership function `mfy`. mfy : 1d array Fuzzy membership function for universe variable `y`. Returns ------- z : 1d array Universe variable for intersection of the two provided fuzzy sets. mfz : 1d array Fuzzy OR (union) of `mfx` and `mfy`. """ # Check if universes are the same return fuzzy_norm(x, mfx, y, mfy, norm=np.fmax)
[docs]def fuzzy_not(mfx): """ Fuzzy NOT operator, a.k.a. complement of a fuzzy set. Parameters ---------- mfx : 1d array Fuzzy membership function. Returns ------- mfz : 1d array Fuzzy NOT (complement) of `mfx`. Notes ----- This operation does not require a universe variable, because the complement is defined for a single set. The output remains defined on the same universe. """ return 1. - mfx