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

Catégorie fleurie

parent 44049d1d
......@@ -42,6 +42,9 @@ class BouquetAbstrait(Morphisme):
return self.foncteur1 == other.foncteur1 and self.foncteur2 == other.foncteur2
return False
def __hash__(self):
return hash((tuple(self.tiges),self.foncteur1,self.foncteur2))
def __str__(self):
return '('+str(self.foncteur1)+','+'/'.join(map(str,self.tiges))+','+str(self.foncteur2)+')'
......@@ -209,41 +212,7 @@ class Bouquet(BouquetPerceptif,BouquetActif):
BouquetPerceptif.__init__(self,foncteur1,foncteur2,tiges,cat_cones1,cat_cones2)
BouquetActif.__init__(self,foncteur1,foncteur2,tiges,cat_cocones1,cat_cocones2)
BouquetAbstrait.__init__(self,foncteur1,foncteur2,tiges,cat_cones1,cat_cones2,cat_cocones1,cat_cocones2)
class CompositionBouquets(BouquetAbstrait):
"""Appeler le constructeur de Composition n'instancie pas forcément une nouvelle composition.
Comparer les composée avec les opérateurs == et !=
/!\ si une identité incohérente est placée dans une composition valide, elle sera simplement omise /!\
"""
def __new__(cls,*bouquets):
if len(bouquets) == 0:
raise Exception("Composition de 0 bouquets")
backup = bouquets
bouquets = [m for m in bouquets if not m.is_identite] #on supprime les identités
if len(bouquets) == 0:
for i in range(1,len(backup)):
if backup[i-1] != backup[i]:
raise Exception("Composition d'identites differentes"+str(backup))
return backup[0]
elif len(bouquets) == 1:
return bouquets[0]
else:
for i in range(1,len(bouquets)):
if bouquets[i-1].cible != bouquets[i].source:
raise Exception("Composition de bouquets impossible : "+bouquets.__repr__())
tiges = bouquets[0].tiges
for i in range(1,len(bouquets)):
nouvelles_tiges = []
for t1 in tiges:
for t2 in bouquets[i].tiges:
if t1.cible == t2.source:
nouvelles_tiges += [bouquets[i].categorie.Composee(t1,t2)]
tiges = copy(nouvelles_tiges)
instance = BouquetAbstrait(bouquets[0].source,bouquets[-1].cible,tiges,bouquets[0].cat_cones1,bouquets[-1].cat_cones2,bouquets[0].cat_cocones1,bouquets[-1].cat_cocones2)
return instance
class BouquetsPerceptifs:
def __init__(self, foncteur1, foncteur2, cat_cones1=None, cat_cones2=None):
......@@ -351,6 +320,38 @@ class Bouquets:
for bouquet in self.bouquets:
bouquet.transformer_graphviz()
class CompositionBouquets(BouquetAbstrait):
"""Appeler le constructeur de Composition n'instancie pas forcément une nouvelle composition.
Comparer les composée avec les opérateurs == et !=
/!\ si une identité incohérente est placée dans une composition valide, elle sera simplement omise /!\
"""
def __new__(cls,*bouquets):
if len(bouquets) == 0:
raise Exception("Composition de 0 bouquets")
backup = bouquets
bouquets = [m for m in bouquets if not m.is_identite] #on supprime les identités
if len(bouquets) == 0:
for i in range(1,len(backup)):
if backup[i-1] != backup[i]:
raise Exception("Composition d'identites differentes"+str(backup))
return backup[0]
elif len(bouquets) == 1:
return bouquets[0]
else:
for i in range(1,len(bouquets)):
if bouquets[i-1].cible != bouquets[i].source:
raise Exception("Composition de bouquets impossible : "+bouquets.__repr__())
tiges = bouquets[0].tiges
for i in range(1,len(bouquets)):
nouvelles_tiges = []
for t1 in tiges:
for t2 in bouquets[i].tiges:
if t1.cible == t2.source:
nouvelles_tiges += [bouquets[i].categorie.Composee(t1,t2)]
tiges = copy(nouvelles_tiges)
instance = BouquetAbstrait(bouquets[0].source,bouquets[-1].cible,tiges,bouquets[0].cat_cones1,bouquets[-1].cat_cones2,bouquets[0].cat_cocones1,bouquets[-1].cat_cocones2)
return instance
def main():
# import random
......
......@@ -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).
......
from Categorie import Categorie
from Bouquet import BouquetsPerceptifs, BouquetsActifs, Bouquets
from Diagramme import DiagrammeIdentite, Objets
from Bouquet import BouquetsPerceptifs, BouquetsActifs, Bouquets, Bouquet,CompositionBouquets
from Diagramme import Triangle,DiagrammeIdentite, DiagrammeObjets
import itertools
class CategorieFleurieAbstraite(Categorie):
"""Catégorie dont les objets sont des diagrammes Di d'intérêt d'une catégorie C.
Les flèches entre les diagrammes sont des bouquets perceptifs."""
def __init__(self,categorie)
Categorie.__init__(self,"Categorie fleurie perceptive")
def __init__(self,categorie,representant="Categorie fleurie"):
Categorie.__init__(self,representant)
self.categorie_initiale = categorie
# on ajoute tous les diagrammes constants
diagrammes_constants = dict() #{obj:Δ(obj)}
for obj in categorie.objets:
diag_constant = DiagrammeObjets(categorie,[obj])
diag_constant.representant = "Δ("+str(obj)+")"
diagrammes_constants[obj] = diag_constant
self.ajouter_objets(diag_constant)
for couple in itertools.product(categorie.objets,repeat=2):
bouquets = Bouquets(diagrammes_constants[couple[0]],diagrammes_constants[couple[1]])
for b in bouquets.bouquets:
self.ajouter_morphisme(b)
if b.is_identite:
self.remplacer_identite(b)
for couple in itertools.product(categorie.objets,repeat=2):
for morph1 in self.fleches_elem(couple[0],couple[1],False):
for obj in categorie.objets:
for morph2 in self.fleches_elem(couple[1],obj,False):
diagramme = Triangle(self,[couple[0],couple[1],obj],[morph1,morph2,CompositionBouquets(morph1,morph2)])
diagramme.faire_commuter()
def ajouter_diagramme_interêt
\ No newline at end of file
def ajouter_diagramme_interet():
pass
def main():
import CategorieAleatoire
import random
random.seed(1)
cat = CategorieAleatoire.CategorieAleaPreOrdreAcyclique()
cat.transformer_graphviz()
cat_f = CategorieFleurieAbstraite(cat)
cat_f.transformer_graphviz()
if __name__ == '__main__':
main()
\ No newline at end of file
......@@ -10,4 +10,8 @@
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 ?
PB avec les bouquets inter : il faut que les bouquets de D1 vers delta(A) soient des cocônes et les bouquets de delta(A) vers D1 sont des cônes (trop restrictif)
\ No newline at end of file
PB avec les bouquets inter : il faut que les bouquets de D1 vers delta(A) soient des cocônes et les bouquets de delta(A) vers D1 sont des cônes (trop restrictif)
1-cocompletion libre
2-categorie fleurie
3-cluster (connexe au debut)
\ No newline at end of file
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