Commit afe864fd authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

CategorieFleurie fonctionnelle

parent 51b648f4
......@@ -229,14 +229,14 @@ class Categorie:
self.morph_entrants[morphisme.cible] += [morphisme]
self.morph_sortants[morphisme.source] += [morphisme]
if morphisme.is_identite:
self.remplacer_identite(morphisme)
self._remplacer_identite(morphisme)
self.verifier_coherence()
def ajouter_morphismes(self, morphismes):
for m in morphismes:
self.ajouter_morphisme(m)
def remplacer_identite(self, morphisme):
def _remplacer_identite(self, morphisme):
"""Remplace l'identité d'un objet par le morphisme."""
if not morphisme.is_identite:
raise Exception(
......@@ -247,8 +247,8 @@ class Categorie:
"Tentative de remplacer une identite par un morphisme qui n'est pas une identite." + str(morphisme))
self.morphismes.remove(self.identites[objet])
self.identites[objet] = morphisme
# self.morph_sortants[objet].remove(morphisme)
# self.morph_entrants[objet].remove(morphisme)
self.morph_sortants[objet].remove(morphisme)
self.morph_entrants[objet].remove(morphisme)
def enumerer_composees_sans_cycle(self, source, cible, noeuds_deja_visites=tuple()):
"""Renvoie tous les morphismes composés allant de source à cible ne contenant aucun cycle (on ne passe jamais deux fois par le même noeud).
......
......@@ -4,6 +4,8 @@ from CategorieCocones import CategorieCocones
from Bouquet import BouquetsPerceptifs, BouquetsActifs, Bouquets, Bouquet,CompositionBouquets
from Diagramme import Triangle,DiagrammeIdentite, DiagrammeObjets
import itertools
from Morphisme import Composition,Morphisme
from config import TOUJOURS_VERIFIER_COHERENCE
class CategorieFleurieAbstraite(Categorie):
"""Catégorie dont les objets sont des diagrammes Di d'intérêt d'une catégorie C.
......@@ -14,54 +16,82 @@ class CategorieFleurieAbstraite(Categorie):
self.categorie_initiale = categorie
# on ajoute tous les diagrammes constants
self.diagrammes_constants = dict() #{obj:Δ(obj)}
self.cat_cones_cocones = {} #{diagramme:{"cat_cones":CategorieCone,"cat_cocones":CategorieCocone}}
self.cat_cones_cocones = {} #{diagramme:{"cat_cones":CategorieCones,"cat_cocones":CategorieCocones}}
for obj in categorie.objets:
diag_constant = DiagrammeObjets(categorie,[obj])
diag_constant.representant = "Δ("+str(obj)+")"
self.diagrammes_constants[obj] = diag_constant
self.ajouter_objets(diag_constant)
for couple in itertools.product(categorie.objets,repeat=2):
bouquets = Bouquets(self.diagrammes_constants[couple[0]],self.diagrammes_constants[couple[1]],self.cat_cones_cocones[self.diagrammes_constants[couple[0]]]["cat_cones"],
self.cat_cones_cocones[self.diagrammes_constants[couple[1]]]["cat_cones"],self.cat_cones_cocones[self.diagrammes_constants[couple[0]]]["cat_cocones"],
self.cat_cones_cocones[self.diagrammes_constants[couple[1]]]["cat_cocones"])
for b in bouquets.bouquets:
self.ajouter_morphisme(b)
if b.is_identite:
self.remplacer_identite(b)
for couple in itertools.product(self.objets,repeat=2):
for morph1 in self.fleches_elem(couple[0],couple[1],False):
for obj in self.objets:
for morph2 in self.fleches_elem(couple[1],obj,False):
composee = CompositionBouquets(morph1,morph2)
for fleche in self.morphismes:
if fleche == composee:
composee = fleche
diagramme = Triangle(self,[couple[0],couple[1],obj],[morph1,morph2,composee])
diagramme.faire_commuter()
self.ajouter_diagramme_interet(diag_constant)
if TOUJOURS_VERIFIER_COHERENCE:
self.verifier_coherence2()
def verifier_coherence2(self):
for A,B,C in itertools.product(self.objets,repeat=3):
for morph1 in self.fleches_elem(A,B,inclure_id=False):
for morph2 in self.fleches_elem(B,C,inclure_id=False):
if Composition(morph1,morph2) not in self.Composee.loi_de_composition:
raise Exception("Incohérence CategorieFleurie : les morphismes "+str(morph1)+" et "+str(morph2)+" n'ont pas de composée dans la loi de composition")
def ajouter_objet(self,objet):
Categorie.ajouter_objet(self,objet)
cat_cones = CategorieCones(objet)
cat_cocones = CategorieCocones(objet)
self.cat_cones_cocones[objet] = {"cat_cones":cat_cones,"cat_cocones":cat_cocones}
def ajouter_diagramme_interet():
pass
def ajouter_diagramme_interet(self,diagramme):
if diagramme.cat_cible != self.categorie_initiale:
raise Exception("Incohérence CategorieFleurie : tentative d'ajout d'un diagramme d'interet qui n'a pas pour cible la meme categorie initiale que les autres diagrammes."+str(diagramme))
self.ajouter_objet(diagramme)
for obj in self.objets:
bouquets = Bouquets(obj,diagramme,self.cat_cones_cocones[obj]["cat_cones"],self.cat_cones_cocones[diagramme]["cat_cones"],
self.cat_cones_cocones[obj]["cat_cocones"], self.cat_cones_cocones[diagramme]["cat_cocones"])
self.ajouter_morphismes(bouquets.bouquets)
if obj != diagramme: #on a déjà fait les flèches de diag vers diag
bouquets = Bouquets(diagramme,obj,self.cat_cones_cocones[diagramme]["cat_cones"],self.cat_cones_cocones[obj]["cat_cones"],
self.cat_cones_cocones[diagramme]["cat_cocones"], self.cat_cones_cocones[obj]["cat_cocones"])
self.ajouter_morphismes(bouquets.bouquets)
for A,B,C in itertools.product(self.objets,repeat=3):
for morph1 in self.fleches_elem(A,B,False):
for morph2 in self.fleches_elem(B,C,False):
composee = CompositionBouquets(morph1,morph2)
for fleche in self.morphismes:
if fleche == composee:
composee = fleche
break
else:
raise Exception("Composition des bouquets n'est pas un bouquet "+str(morph1)+" "+str(morph2)+" "+str(composee)+"\n"+str(self.morphismes))
diagramme = Triangle(self,[A,B,C],[morph1,morph2,composee])
diagramme.faire_commuter()
def main():
import CategorieAleatoire
import random
import Diagramme
# random.seed(1918652)
# cat = CategorieAleatoire.CategorieAleaPreOrdre()
# cat.transformer_graphviz(afficher_identites=True)
# cat_f = CategorieFleurieAbstraite(cat)
# cat_f.transformer_graphviz(complet=True)
cat = Categorie("2")
cat.ajouter_objets("AB")
f,g = [Morphisme('A','B','f'),Morphisme('A','B','g')]
cat.ajouter_morphismes([f,g])
diag1 = Diagramme.Fleche(cat,f)
diag2 = Diagramme.Fleche(cat,g)
random.seed(1918652)
cat = CategorieAleatoire.CategorieAleaPreOrdre()
cat.transformer_graphviz(afficher_identites=True)
diag1.transformer_graphviz()
diag2.transformer_graphviz()
cat_f = CategorieFleurieAbstraite(cat)
cat_f.transformer_graphviz(complet=True)
cat_fleurie = CategorieFleurieAbstraite(cat)
cat_fleurie.transformer_graphviz(afficher_identites=True)
cat_fleurie.ajouter_diagramme_interet(diag1)
cat_fleurie.transformer_graphviz(afficher_identites=True)
cat_fleurie.ajouter_diagramme_interet(diag2)
cat_fleurie.transformer_graphviz(afficher_identites=True)
if __name__ == '__main__':
main()
\ No newline at end of file
......@@ -19,9 +19,9 @@ class Diagramme(Foncteur.Foncteur):
nb_viz = 0
_id = 0
def __init__(self,categorie_indexante,categorie_indexee, application_objets, application_morphismes):
def __init__(self,categorie_indexante,categorie_indexee, application_objets, application_morphismes,representant=None):
self.categorie_indexante = copy.copy(categorie_indexante)
Foncteur.Foncteur.__init__(self,self.categorie_indexante,categorie_indexee, application_objets, application_morphismes)
Foncteur.Foncteur.__init__(self,self.categorie_indexante,categorie_indexee, application_objets, application_morphismes,representant=representant)
self.categorie_indexee = categorie_indexee
self._id = Diagramme._id
Diagramme._id += 1
......@@ -264,7 +264,7 @@ class Fleche(Diagramme):
def __init__(self, categorie_indexee, fleche_a_selectionner):
""" objets_a_selectionner est une listes d'objets à selectionner dans la catégorie."""
Diagramme.__init__(self,Fleche._cat,categorie_indexee,{1:fleche_a_selectionner.source,2:fleche_a_selectionner.cible},{Fleche._f:fleche_a_selectionner})
Diagramme.__init__(self,Fleche._cat,categorie_indexee,{1:fleche_a_selectionner.source,2:fleche_a_selectionner.cible},{Fleche._f:fleche_a_selectionner},representant="D"+str(fleche_a_selectionner))
class Chemins(Diagramme):
"""Diagramme des chemins entre deux objets"""
......
......@@ -6,6 +6,7 @@
- Retirer image objets de Parallele
- Créer deux catégorie, une où toutes les composées sont générées lors de l'enumeration (peu de contrainte de composition) et une plus graphe de composition (bcp de contraintes de composition)
-transformer la liste en tiges en ensemble de tiges
- ajouter une méthode dans Diagramme qui renvoie la cat_cone ou cat_cocone si on l'apelle et la stocke dans un attribut une fois qu'on l'a calculée
Q : Maximalité des cluster et identité (comment on obtient un cluster identité avec la maximalité ?)
Est-ce que les clusters identités en sont vraiment ?
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment