I am trying to create fuzzy a ctrl.ControlSystemSimulation with scikit-fuzzy package. To do that, I created Antecedents ( Antecedent: Luminosité_intérieure and Antecedent: Luminosité_intérieure), Consequent (Consequent: Ouverture) and memberships functions based on my database. The problem is to create ctrl.Rule() dynamically using loop. Here are my rules as python dict :
{'Ouverture:Fermé': [{'Chaud': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure}],
'Ouverture:Mi-Hauteur': [{'Chaud': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure},
{'Fort': Antecedent: Luminosité_intérieure,
'Frais': Antecedent: Température_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure}],
'Ouverture:Ouvert': [{'Froid': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure},
{'Chaud': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure},
{'Froid': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure},
{'Fort': Antecedent: Luminosité_intérieure,
'Froid': Antecedent: Température_intérieure},
{'Frais': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure},
{'Frais': Antecedent: Température_intérieure,
'Moyen': Antecedent: Luminosité_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Sombre': Antecedent: Luminosité_intérieure}]}
Where :
{'Ouverture:Fermé': [{'Chaud': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure},
{'Doux': Antecedent: Température_intérieure,
'Fort': Antecedent: Luminosité_intérieure}], ...}
meanings
Ferme = ctrl.Rule(antecedent=((Température_intérieure['Chaud'] & Luminosité_intérieure['Fort']) |
(Température_intérieure['Doux'] & Luminosité_intérieure['Fort'])),
consequent=Ouverture['Ferme']
I would like to know how I can generate this kind of rule with a python code loop. Thanks a lot.
EDIT :
Ok, so maybe i have to add more details. I need to format my dict to skfuzzy.control.Term / TermAggregate, and I really don't understand this classe object. But, I tried somethings yersterday and I can say this one :
using this function :
functools.reduce(lambda x, y: x & y, [antecedent[qualificatif] for k2,v2 in elt_list.items()])
I can now produce this output which is good :
{'Fermé': [Température_intérieure[Chaud] AND Luminosité_intérieure[Fort],
Température_intérieure[Doux] AND Luminosité_intérieure[Fort]],
'Mi-Hauteur': [Luminosité_intérieure[Moyen] AND Température_intérieure[Chaud],
Luminosité_intérieure[Fort] AND Température_intérieure[Frais],
Température_intérieure[Doux] AND Luminosité_intérieure[Moyen]],
'Ouvert': [Température_intérieure[Froid] AND Luminosité_intérieure[Sombre],
Température_intérieure[Chaud] AND Luminosité_intérieure[Sombre],
Luminosité_intérieure[Moyen] AND Température_intérieure[Froid],
Luminosité_intérieure[Fort] AND Température_intérieure[Froid],
Température_intérieure[Frais] AND Luminosité_intérieure[Sombre],
Luminosité_intérieure[Moyen] AND Température_intérieure[Frais],
Température_intérieure[Doux] AND Luminosité_intérieure[Sombre]]}
The last step is to produce the "OR" concatenation between element list like this :
{'Fermé': [Température_intérieure[Chaud] AND Luminosité_intérieure[Fort] OR
Température_intérieure[Doux] AND Luminosité_intérieure[Fort]]
For a list of length 2 it works with this function :
functools.reduce(lambda x, y: x | y, list_of_rules_by_key)
but this one produce this output :
{'Fermé': (Température_intérieure[Chaud] AND Luminosité_intérieure[Fort]) OR (Température_intérieure[Doux] AND Luminosité_intérieure[Fort]),
'Mi-Hauteur': ((Luminosité_intérieure[Moyen] AND Température_intérieure[Chaud]) OR (Luminosité_intérieure[Fort] AND Température_intérieure[Frais])) OR (Température_intérieure[Doux] AND Luminosité_intérieure[Moyen]),
'Ouvert': ((((((Température_intérieure[Froid] AND Luminosité_intérieure[Sombre]) OR (Température_intérieure[Chaud] AND Luminosité_intérieure[Sombre])) OR (Luminosité_intérieure[Moyen] AND Température_intérieure[Froid])) OR (Luminosité_intérieure[Fort] AND Température_intérieure[Froid])) OR (Température_intérieure[Frais] AND Luminosité_intérieure[Sombre])) OR (Luminosité_intérieure[Moyen] AND Température_intérieure[Frais])) OR (Température_intérieure[Doux] AND Luminosité_intérieure[Sombre])}
Funtools.reduce produce this output syntax (based on https://docs.python.org/fr/3/library/functools.html : reduce(lambda x, y: x | y, [1, 2, 3, 4, 5]) gives ((((1|2)|3)|4)|5) which is not I want. What I want is (1 | 2 | 3 | 4 | 5) where each value represents each element of lists
Thanks a lot