def test_fuzzy_membership_iris():
    params = Hyperparameters(fuzzy=0.5, epsilon=0.5)
    dataset = load_iris()

    x_p = dataset.data[np.where(dataset.target == 0)]
    x_n = dataset.data[np.where(dataset.target == 1)]

    membership = fuzzy_membership(params=params, class_p=x_p, class_n=x_n)

    _truth = np.asarray(
        [[0.80251715], [0.97998912], [0.812318], [0.9807224], [0.98189354],
         [0.99937236], [0.96043452], [0.56903383], [0.97212066], [0.96048151],
         [0.60125974], [0.99984087], [0.97872578], [0.99542787], [0.97290636],
         [0.95614206], [0.99496593], [0.99843223], [0.9804573], [0.9889402],
         [0.95800151], [0.99971397], [0.96464217], [0.99565949], [0.99577327],
         [0.97731756], [0.90653641], [0.84949026], [0.999488], [0.94963879],
         [0.97055683], [0.95245829], [0.9980525], [0.94679333], [0.98472415],
         [0.9759757], [0.92815776], [0.98848116], [0.99733116], [0.99105587],
         [0.99493091], [0.9970333], [0.99903366], [0.61157738], [0.9992254],
         [0.99909612], [1.], [0.99982867], [0.5], [0.99991744]])
    assert_allclose(membership.sn, _truth)

    _truth = np.asarray(
        [[0.99992168], [0.9917287], [0.99376558], [0.98430655], [0.99974305],
         [0.95670035], [0.99387979], [1.], [0.91239646], [0.99587275],
         [0.98883625], [0.99914972], [0.98704236], [0.85665848], [0.78204237],
         [0.56573912], [0.96225372], [0.99991496], [0.90482216], [0.99526856],
         [0.99049658], [0.99760092], [0.96536234], [0.99558788], [0.98841007],
         [0.99139502], [0.99961253], [0.99956062], [0.99959803], [0.99427123],
         [0.99396476], [0.99323856], [0.94598095], [0.85250365], [0.99691726],
         [0.99689705], [0.98412401], [0.99910674], [0.93096412], [0.99996815],
         [0.99976035], [0.5], [0.95871688], [0.99539269], [0.9728796],
         [0.98887459], [0.99416071], [0.98977514], [0.99446211], [0.99990073]])

    assert_allclose(membership.sp, _truth)
def test_fuzzy_membership_no_noise(valid_ensemble_a, valid_ensemble_b):
    params = Hyperparameters(fuzzy=0.5, epsilon=0.5)

    _fuzzy = fuzzy_membership(params=params,
                              class_p=valid_ensemble_a,
                              class_n=valid_ensemble_b)

    _truth = np.asarray([[1.0], [0.5], [0.5]])

    assert np.isclose(_fuzzy.sp, _truth).all()
    assert np.isclose(_fuzzy.sn, _truth).all()

    assert not np.nonzero(_fuzzy.noise_p)[0].size > 0
    assert not np.nonzero(_fuzzy.noise_n)[0].size > 0
def test_fuzzy_membership_noise(valid_ensemble_a, valid_ensemble_b):
    params = Hyperparameters(fuzzy=0.5, epsilon=0.5)

    # Update ensemble "b" to have a point closer to center of "a"
    valid_ensemble_b[0][0] = 0.8
    valid_ensemble_b[0][1] = 0.8

    _fuzzy = fuzzy_membership(params=params,
                              class_p=valid_ensemble_a,
                              class_n=valid_ensemble_b)

    _truth_p = np.asarray([[1.0], [0.5], [0.5]])
    _truth_n = np.asarray([[0.5], [1.0], [1.0]])

    assert np.isclose(_fuzzy.sp, _truth_p).all()
    assert np.isclose(_fuzzy.sn, _truth_n).all()

    assert not np.nonzero(_fuzzy.noise_p)[0].size > 0
    assert np.nonzero(_fuzzy.noise_n)[0] == [0]
def test_fuzzy_membership_epsilon_error(valid_ensemble_a, valid_ensemble_b, u,
                                        epsilon):
    params = Hyperparameters(fuzzy=u, epsilon=epsilon)

    with pytest.raises(ValueError):
        _ = fuzzy_membership(params, valid_ensemble_a, valid_ensemble_b)