class DetecteurSpam:
    def __init__(self, nb_entrees):
        self.biais = 0.0
        self.poids = [0.0 for i in range(nb_entrees)]

    def get_biais(self):
        return self.biais

    def set_biais(self, nouveau_biais):
        self.biais = nouveau_biais

    def get_poids(self):
        return self.poids

    def set_poids(self, nouveaux_poids):
        assert len(nouveaux_poids) == len(self.poids)
        self.poids = nouveaux_poids
        
    def fonction_activation(self, valeur):
        if valeur >= 0:
            return 1
        return 0
    
    def prediction(self, entrees):
        somme = 0
        for i in range(len(entrees)):
            somme += entrees[i] * self.poids[i]
        somme += self.biais
        sortie = self.fonction_activation(somme)
        return sortie
    
    def entrainement(self, echantillon, cibles, taux=0.1):
        nb_erreurs = 0
        for i in range(len(echantillon)):
            entrees = echantillon[i]
            cible = cibles[i]
            # calcul de la prédiction
            predict = self.prediction(entrees)
            if predict != cible:
                # prédiction incorrecte
                nb_erreurs += 1
                erreur = cible - predict
                for j in range(len(self.poids)):
                    self.poids[j] += taux * erreur * entrees[j]
                self.biais += taux * erreur
        return nb_erreurs

detecteur = DetecteurSpam(2)
# detecteur.set_poids([0.7, -0.2])
# detecteur.set_biais(0.1)

echantillon = [[0.5, 0.3], [0.2, 0.1], [0.4, 0.8], [0.7, 0.9]]
cibles = [0, 1, 1, 1]

emails = [[0, 0], [0, 1], [1, 0], [1, 1]]
spams = [0, 0, 0, 1]

nb_epoques_max = 1000
nb_erreurs = detecteur.entrainement(emails, spams, taux=0.1)
nb_epoques = 1

while nb_erreurs > 0 and nb_epoques < nb_epoques_max:
    nb_erreurs = detecteur.entrainement(emails, spams, taux=0.1)
    nb_epoques += 1

if nb_erreurs == 0:
    print(nb_epoques - 1)
else:
    print(-1)
