Commit 98c9bcb5 authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

Correction Cluster, mais toujours pas correct parce que je ne comprends pas la...

Correction Cluster, mais toujours pas correct parce que je ne comprends pas la condition 2 et notamment comment on teste l'inclusion des composantes sortant de d avec les objets de la comma category sachant que les objets de la comma category sont des paires fleche/objet indexant
parent cb715b9d
from Categorie import Categorie
import Cluster
from Cluster import ClusterActif,CompositionClustersActifs
from Diagramme import Triangle,DiagrammeIdentite, DiagrammeObjets
import itertools
......@@ -115,7 +116,7 @@ def main():
cat.transformer_graphviz(afficher_identites=True)
fonct.transformer_graphviz()
print(a,b,fonct)
a.transformer_graphviz()
b.transformer_graphviz()
# cat = Categorie("3")
# cat.ajouter_objets("ABabC")
......
from Categorie import Categorie
from Diagramme import DiagrammeIdentite, Triangle
from Diagramme import DiagrammeIdentite
import itertools
from Morphisme import Morphisme
from copy import copy
......@@ -22,10 +22,8 @@ class CategorieComposantesConnexes(Categorie):
morphisme = Morphisme(morph.source,morph.cible,morph.representant)
inverse = Morphisme(morph.cible,morph.source,morph.representant+'^-1')
self.ajouter_morphismes([morphisme,inverse])
diag = Triangle(self,[morph.source,morph.cible,morph.source],[morphisme,inverse,self.identites[morph.source]])
diag.faire_commuter()
diag = Triangle(self,[morph.cible,morph.source,morph.cible],[inverse,morphisme,self.identites[morph.cible]])
diag.faire_commuter()
diag = DiagrammeIdentite(self)
diag.faire_commuter()
def main():
......
......@@ -8,7 +8,7 @@ class ObjetCategorieFSous:
"""Soit C une catégorie, S un foncteur de I dans C et b un objet de C.
CategorieFSous est la catégorie S-en-dessous de b
(cf. Mac Lane "Categories for the working mathematician" P.45)
Ses objets sont les couples de flèches C(b,S(d)) et d
Ses objets sont les couples de flèches C(f,S(d)) et d
Ses flèches sont des flèches telles que les triangles formés commutent.
"""
def __init__(self,f,d):
......@@ -22,7 +22,7 @@ class CategorieFSous(Categorie):
"""Soit C une catégorie, S un foncteur de I dans C et b un objet de C.
CategorieFSous est la catégorie S-en-dessous de b
(cf. Mac Lane "Categories for the working mathematician" P.45)
Ses objets sont les couples de flèches C(b,S(d)) et d
Ses objets sont les couples de flèches C(f,S(d)) et d
Ses flèches sont des flèches telles que les triangles formés commutent.
"""
......@@ -32,11 +32,11 @@ class CategorieFSous(Categorie):
self.foncteur = foncteur
self.objet = objet
self.app_index_obj = {} #associe à chaque objet de la catégorie indexante les objets qui ont été générés à partir de lui
# {d : [<C(a,Sd),d>]}
# {d : [<f \in C(a,Sd),d>]}
self.app_morph_index = {} #associe à chaque morphisme de cette catégorie le morphisme de la catégorie indexante qui l'a généré
# {f':<C(a,Sd),d>-><C(a,Sd'),d'> : f:d->d'}
# {f':<f \in C(a,Sd),d>-><f'\in C(a,Sd'),d'> : f:d->d'}
self.app_index_morph = {} #inverse de l'application précédente, on ajoute le couple (<C(a,Sd),d>,<C(a,Sd'),d'>) pour rendre l'application bijective
# {(f:d->d',(<C(a,Sd),d>,<C(a,Sd'),d'>)) : f':<C(a,Sd),d>-><C(a,Sd'),d'>}
# {(f:d->d',(<f \in C(a,Sd),d>,<f'\in C(a,Sd'),d'>)) : f':<f \in C(a,Sd),d>-><f'\in C(a,Sd'),d'>}
#on ajoute les objets
for d in foncteur.app_objets:
......@@ -51,20 +51,20 @@ class CategorieFSous(Categorie):
#on ajoute les flèches
for fleche in foncteur.cat_source.morphismes:
for source in self.app_index_obj[fleche.source]:
for cible in self.app_index_obj[fleche.cible]:
if not (source == cible and fleche.is_identite) :
Sh = foncteur(fleche)
if categorie.Composee(source.f,Sh) == cible.f:
morph = Morphisme(source,cible,Sh.representant)
self.ajouter_morphisme(morph)
self.app_morph_index[morph] = fleche
if fleche in self.app_index_morph:
raise Exception(str(fleche)+" deja dans app_index_morph "+str(self.app_index_morph))
self.app_index_morph[(fleche,(source,cible))] = morph
for source in self.app_index_obj[fleche.source]:
for cible in self.app_index_obj[fleche.cible]:
if not (source == cible and fleche.is_identite) :
Sh = foncteur(fleche)
if categorie.Composee(source.f,Sh) == cible.f:
morph = Morphisme(source,cible,Sh.representant)
self.ajouter_morphisme(morph)
self.app_morph_index[morph] = fleche
if fleche in self.app_index_morph:
raise Exception(str(fleche)+" deja dans app_index_morph "+str(self.app_index_morph))
self.app_index_morph[(fleche,(source,cible))] = morph
#on fait commuter les flèches
for A,B in itertools.combinations(self.objets,2):
for A,B in itertools.product(self.objets,repeat=2):
for g in self.morph_sortants[B]:
C = g.cible
for f in self.fleches_elem(A,B,inclure_id=False):
......
......@@ -4,7 +4,7 @@ import itertools
from copy import copy
if GRAPHVIZ_ENABLED:
from graphviz import Digraph
from CategorieSous import CategorieSous
from CategorieSous import CategorieFSous, ObjetCategorieFSous
from CategorieComposantesConnexes import CategorieComposantesConnexes
......@@ -104,6 +104,7 @@ class ProtoClusterActif(ClusterAbstrait):
"""Seules les contraintes sur les cocônes sont prises en compte pour le cluster actif"""
def __init__(self, foncteur1, foncteur2, composantes):
"""composantes liste de morphisme incluse dans Interact(foncteur1,foncteur2)"""
ClusterAbstrait.__init__(self,foncteur1, foncteur2, composantes)
if TOUJOURS_VERIFIER_COHERENCE:
ProtoClusterActif.verifier_coherence(self)
......@@ -126,17 +127,26 @@ class ProtoClusterActif(ClusterAbstrait):
else:
raise Exception("Incoherence ProtoClusterActif : l'objet "+str(self.foncteur1(d))+" de D1 n'a pas de d'image par le cluster")
# contrainte 2) les composantes qui sortent d'un objet d de D1 mènent à des objets e de D2 reliés par un zig zag dans la catégorie sous d
# contrainte 2) les composantes qui sortent d'un objet d de D1 mènent à des objets e de D2 reliés par un zig zag dans la comma catégorie (D(d)|E)
for d in self.foncteur1.cat_source.objets:
E_e = [] #les images des composantes
for composante in self.composantes:
if composante.source == self.foncteur1(d):
E_e += [composante.cible]
cat_sous = CategorieSous(self.categorie, self.foncteur1(d))
E_e += [composante]
cat_sous = CategorieFSous(self.foncteur2, self.foncteur1(d))
cat_cc = CategorieComposantesConnexes(cat_sous)
# on vérifie que tous les E(e) sont isomorphes dans la catégorie des composantes connexes de la catégorie sous D(d)
for e in E_e[1:]:
if cat_cc.existe_composee(E_e[0],e) == None:
for obj1 in cat_cc.objets: #todo corriger tout ça !!!
if obj1.f == e:
for obj2 in cat_cc.objets:
if obj2.f == E_e[0]:
if cat_cc.existe_composee(obj1,obj2) != None:
break
else:
continue
break
else:
raise Exception("Incoherence ProtoClusterActif : l'objet "+str(E_e[0])+" n'est pas dans la même composante connexe que "+str(e))
# contrainte 3) eog = g'
......@@ -170,7 +180,7 @@ class ProtoClustersActifs:
for i in self.foncteur1.source.objets for j in self.foncteur2.source.objets}
fleches = [e for liste in objets_comma_category.values() for e in liste]
cat_cc = {d:CategorieComposantesConnexes(CategorieSous(self.categorie, self.foncteur1(d))) for d in self.foncteur1.cat_source.objets}
cat_cc = {d:CategorieComposantesConnexes(CategorieFSous(self.foncteur2, self.foncteur1(d))) for d in self.foncteur1.cat_source.objets}
# on énumère toutes les interactions de D1 à D2
for nb_fleches in range(1,len(fleches)+1):
......@@ -190,10 +200,19 @@ class ProtoClustersActifs:
E_e = [] #les images des composantes
for composante in interaction:
if composante.source == self.foncteur1(d):
E_e += [composante.cible]
E_e += [composante]
# on vérifie que tous les E(e) sont isomorphes dans la catégorie des composantes connexes de la catégorie sous D(d)
for e in E_e[1:]:
if cat_cc[d].existe_composee(E_e[0],e) == None:
for e in E_e[1:]: #todo corriger tout ça !!!
for obj1 in cat_cc[d].objets: #todo corriger tout ça !!!
if obj1.f == e:
for obj2 in cat_cc[d].objets:
if obj2.f == E_e[0]:
if cat_cc[d].existe_composee(obj1,obj2) != None:
break
else:
continue
break
else:
ajouter_cluster = False #raise Exception("Incoherence ProtoClusterActif : l'objet "+str(E_e[0])+" n'est pas dans la même composante connexe que "+str(e))
break
else:
......@@ -247,6 +266,9 @@ class ProtoClustersActifs:
def __iter__(self):
for cluster in self.clusters_actifs:
yield cluster
def __len__(self):
return len(self.clusters_actifs)
class ClusterActif(ProtoClusterActif):
def __new__(cls,foncteur1,foncteur2):
......
......@@ -220,7 +220,7 @@ class Diagramme(Foncteur.Foncteur):
print("Warning : foncteur incoherent cree, on passe au suivant, "+str(e))
def transformer_graphviz(self, destination=None):
def transformer_graphviz(self, destination=None,afficher_identite=False):
"""Permet de visualiser la categorie indexee par le diagramme avec graphviz"""
Diagramme.nb_viz += 1
image = self.implementation()
......@@ -236,7 +236,7 @@ class Diagramme(Foncteur.Foncteur):
graph.node(str(o),color="grey85")#"grey60")
for f in set(list(self.app_morph.values())+self.cat_cible.morphismes):
if not f.is_identite:
if not f.is_identite or afficher_identite:
if f in self.app_morph.values():
graph.edge(str(f.source),str(f.cible),label=str(f.representant), weight="1000", color="orange")
else:
......
......@@ -6,7 +6,7 @@ import random
import itertools
from Morphisme import Morphisme
import Foncteur
import Cluster
......@@ -177,26 +177,26 @@ import Foncteur
# bouquets = Bouquet.Bouquets(diag2,diag1)
# bouquets.transformer_graphviz()
cat = Categorie.Categorie("Rosen")
cat.ajouter_objets("ABfp")
# cat = Categorie.Categorie("Rosen")
# cat.ajouter_objets("ABfp")
a,b,c,d,e,g = [Morphisme('A','B','a'),Morphisme('B','f','b'),Morphisme('f','B','c'),Morphisme('f','p','d'),Morphisme('p','f','e'),Morphisme('B','p','g')]
cat.ajouter_morphismes([a,b,c,d,e,g])
# a,b,c,d,e,g = [Morphisme('A','B','a'),Morphisme('B','f','b'),Morphisme('f','B','c'),Morphisme('f','p','d'),Morphisme('p','f','e'),Morphisme('B','p','g')]
# cat.ajouter_morphismes([a,b,c,d,e,g])
diag = Diagramme.DiagrammeIdentite(cat)
diag.faire_commuter()
cat.csv_loi_de_composition('lois de composition/loi.csv')
# diag = Diagramme.DiagrammeIdentite(cat)
# diag.faire_commuter()
# cat.csv_loi_de_composition('lois de composition/loi.csv')
diag = Diagramme.Fleche(cat,a)
# diag = Diagramme.Fleche(cat,a)
cat.transformer_graphviz()
cat_fleurie = CategorieFleurie.CategorieFleurie(cat)
cat_fleurie.ajouter_diagramme_interet(diag)
cat_fleurie.transformer_graphviz()
# cat.transformer_graphviz()
# cat_fleurie = CategorieFleurie.CategorieFleurie(cat)
# cat_fleurie.ajouter_diagramme_interet(diag)
# cat_fleurie.transformer_graphviz()
cat_cluster = CategorieClusters.CategorieClustersActifs(cat)
cat_cluster.ajouter_diagramme_interet(diag)
cat_cluster.transformer_graphviz()
# cat_cluster = CategorieClusters.CategorieClustersActifs(cat)
# cat_cluster.ajouter_diagramme_interet(diag)
# cat_cluster.transformer_graphviz()
# cat = Categorie.Categorie("Test cocone cluster")
# cat.ajouter_objets("ABC")
......@@ -232,4 +232,3 @@ cat_cluster.transformer_graphviz()
......@@ -15,4 +15,6 @@ PB avec les bouquets inter : il faut que les bouquets de D1 vers delta(A) soient
1-cocompletion libre
2-categorie fleurie
3-cluster (connexe au debut)
\ No newline at end of file
3-cluster (connexe au debut)
pb dans les cluster, condition 2 : on peut pas comparer les flèches du cluster les objets de la comma catégorie car dans la comma catégorie les flèches sont associées un objet indexant (important)
\ 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