# Univerzitet u Novom Sadu, Fakultet tehničkih nauka, Novi Sad, Srbija
# Studijski program OAS Informacioni inženjering
# Predmet Metode i tehnike nauke o podacima

# Pomoćni sadržaj


# %% Implementacija fazi skupa i operacija

class FaziSkupDiskretni:
    def __init__(self, pripadnost):
        self.pripadnost = pripadnost
        self.univerzum = [k for k in pripadnost.keys()]

    def očitavanje_pripadnosti(self, x):
        return self.pripadnost[x]

def komplement_diskretni(a):
    pripadnost = {}
    for entitet in a.univerzum:
        pripadnost[entitet] = 1 - a.očitavanje_pripadnosti(entitet)
    return FaziSkupDiskretni(pripadnost)

def unija_diskretna(a, b):
    if a.univerzum == b.univerzum:
        pripadnost = {}
        for entitet in a.univerzum:
            pripadnost[entitet] = max(a.očitavanje_pripadnosti(entitet),
                                      b.očitavanje_pripadnosti(entitet))
        return FaziSkupDiskretni(pripadnost)

def presek_diskretni(a, b):
    if a.univerzum == b.univerzum:
        pripadnost = {}
        for entitet in a.univerzum:
            pripadnost[entitet] = min(a.očitavanje_pripadnosti(entitet),
                                      b.očitavanje_pripadnosti(entitet))
        return FaziSkupDiskretni(pripadnost)

def razlika_diskretna(a, b):
    if a.univerzum == b.univerzum:
        pripadnost = {}
        for entitet in a.univerzum:
            pripadnost[entitet] = min(a.očitavanje_pripadnosti(entitet),
                                      1 - b.očitavanje_pripadnosti(entitet))
        return FaziSkupDiskretni(pripadnost)


# %% Upotreba fazi skupa

fazi_skup_a = FaziSkupDiskretni({"p": 1.0, "q": 0.8, "r": 0.6,
                                 "s": 0.4, "t": 0.2, "u": 0.0})

fazi_skup_b = FaziSkupDiskretni({"p": 0.2, "q": 0.6, "r": 1.0,
                                 "s": 0.6, "t": 0.2, "u": 0.0})

fazi_skup_c = FaziSkupDiskretni({"x": 0.0, "y": 0.6, "z": 1.0})

print("Fazi skup A:", fazi_skup_a.pripadnost)
print("Fazi skup B:", fazi_skup_b.pripadnost)
print("Fazi skup C:", fazi_skup_c.pripadnost)
print("Komplement C", komplement_diskretni(fazi_skup_c).pripadnost)
print("A unija B", unija_diskretna(fazi_skup_a, fazi_skup_b).pripadnost)
print("A presek B", presek_diskretni(fazi_skup_a, fazi_skup_b).pripadnost)
print("A razlika B", razlika_diskretna(fazi_skup_a, fazi_skup_b).pripadnost)
print("A razlika B", presek_diskretni(
    fazi_skup_a, komplement_diskretni(fazi_skup_b)).pripadnost)

