Commit 8468d55f authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

Tentative de correction supprimer morphisme et objet

parent f096920c
......@@ -31,10 +31,14 @@ class BouquetAbstrait(Morphisme):
Composante bleue foncée : cocones
Composante orange: Bouquet"""
Bouquet.nb_viz += 1
self.cat_cones1 = CategorieCones(self.foncteur1)
self.cat_cones2 = CategorieCones(self.foncteur2)
self.cat_cocones1 = CategorieCocones(self.foncteur1)
self.cat_cocones2 = CategorieCocones(self.foncteur2)
if not hasattr(self,'cat_cones1'):
self.cat_cones1 = CategorieCones(self.foncteur1)
if not hasattr(self,'cat_cones2'):
self.cat_cones2 = CategorieCones(self.foncteur2)
if not hasattr(self,'cat_cocones1'):
self.cat_cocones1 = CategorieCocones(self.foncteur1)
if not hasattr(self,'cat_cocones2'):
self.cat_cocones2 = CategorieCocones(self.foncteur2)
image1 = self.foncteur1.categorie_image()
image2 = self.foncteur2.categorie_image()
if destination == None:
......@@ -330,58 +334,58 @@ class Bouquets:
def main():
import random
random.seed(156)
import CategorieAleatoire
cat1 = CategorieAleatoire.CategorieAleaPreOrdreAcyclique(10,0.5)
from Morphisme import Morphisme
nouveau = Morphisme(4,7,'m')
cat1.ajouter_morphisme(nouveau)
cat1.transformer_graphviz()
# import random
# random.seed(156)
# import CategorieAleatoire
# cat1 = CategorieAleatoire.CategorieAleaPreOrdreAcyclique(10,0.5)
# from Morphisme import Morphisme
# nouveau = Morphisme(4,7,'m')
# cat1.ajouter_morphisme(nouveau)
# cat1.transformer_graphviz()
import Diagramme
diag1 = Diagramme.DiagrammeAlea(cat1,1)
diag1.transformer_graphviz()
for i in range(100):
random.random()
diag2 = Diagramme.DiagrammeAlea(cat1,1)
diag2.transformer_graphviz()
# import Diagramme
# diag1 = Diagramme.DiagrammeAlea(cat1,1)
# diag1.transformer_graphviz()
# for i in range(100):
# random.random()
# diag2 = Diagramme.DiagrammeAlea(cat1,1)
# diag2.transformer_graphviz()
import CategorieCones, CategorieCocones
cat_cones1 = CategorieCones.CategorieCones(diag1)
cat_cones1.transformer_graphviz(destination="graphviz/cat_cones1")
# import CategorieCones, CategorieCocones
# cat_cones1 = CategorieCones.CategorieCones(diag1)
# cat_cones1.transformer_graphviz(destination="graphviz/cat_cones1")
cat_cones2 = CategorieCones.CategorieCones(diag2)
cat_cones2.transformer_graphviz(destination="graphviz/cat_cones2")
# cat_cones2 = CategorieCones.CategorieCones(diag2)
# cat_cones2.transformer_graphviz(destination="graphviz/cat_cones2")
cat_cocones1 = CategorieCocones.CategorieCocones(diag1)
cat_cocones1.transformer_graphviz(destination="graphviz/cat_cocones1")
# cat_cocones1 = CategorieCocones.CategorieCocones(diag1)
# cat_cocones1.transformer_graphviz(destination="graphviz/cat_cocones1")
cat_cocones2 = CategorieCocones.CategorieCocones(diag2)
cat_cocones2.transformer_graphviz(destination="graphviz/cat_cocones2")
# cat_cocones2 = CategorieCocones.CategorieCocones(diag2)
# cat_cocones2.transformer_graphviz(destination="graphviz/cat_cocones2")
# from Categorie import Categorie
# from Morphisme import Morphisme
# from Foncteur import Foncteur
# cat = Categorie()
# cat.ajouter_objets("ABCDO")
# f,g,h,i,j,k,l,m = [Morphisme('O','A','f'),Morphisme('O','B','g'),Morphisme('A','B','h'),Morphisme('O','C','i'),Morphisme('O','D','j'),Morphisme('C','D','k'),Morphisme('B','C','l'),Morphisme('A','D','m')]
# cat.ajouter_morphismes([f,g,h,i,j,k,l,m])
# from CategoriePreordre import CategoriePreordre
# cat2 = CategoriePreordre(cat)
# n,o = [Morphisme('O','A','n'),Morphisme('O','B','o')]
# cat2.ajouter_morphismes([n])
# cat2.transformer_graphviz()
from Categorie import Categorie
from Morphisme import Morphisme
from Foncteur import Foncteur
cat = Categorie()
cat.ajouter_objets("ABCDO")
f,g,h,i,j,k,l,m = [Morphisme('O','A','f'),Morphisme('O','B','g'),Morphisme('A','B','h'),Morphisme('O','C','i'),Morphisme('O','D','j'),Morphisme('C','D','k'),Morphisme('B','C','l'),Morphisme('A','D','m')]
cat.ajouter_morphismes([f,g,h,i,j,k,l,m])
from CategoriePreordre import CategoriePreordre
cat2 = CategoriePreordre(cat)
n,o = [Morphisme('O','A','n'),Morphisme('O','B','o')]
cat2.ajouter_morphismes([n])
cat2.transformer_graphviz()
# cat_fleche = Categorie()
# cat_fleche.ajouter_objets("AB")
# a = Morphisme('A','B','a')
# cat_fleche.ajouter_morphismes([a])
cat_fleche = Categorie()
cat_fleche.ajouter_objets("AB")
a = Morphisme('A','B','a')
cat_fleche.ajouter_morphismes([a])
# fonct1 = Foncteur(cat_fleche,cat2,{'A':'A','B':'B'},{a:h})
# fonct2 = Foncteur(cat_fleche,cat2,{'A':'C','B':'D'},{a:k})
fonct1 = Foncteur(cat_fleche,cat2,{'A':'A','B':'B'},{a:h})
fonct2 = Foncteur(cat_fleche,cat2,{'A':'C','B':'D'},{a:k})
bouquets = Bouquets(diag1,diag2,cat_cones1,cat_cones2,cat_cocones1,cat_cocones2)
bouquets = Bouquets(fonct1,fonct2)
bouquets.transformer_graphviz()
......
......@@ -202,9 +202,8 @@ class Categorie:
if len(d.cat_source.morph_entrants[objet]) == len(d.cat_source.morph_sortants[objet]) == 0:
d.cat_source.supprimer_objet(objet)
else:
d.transformer_graphviz()
d.cat_source.transformer_graphviz(destination="graphviz/debug",complet=False)
raise Exception("Il reste des morphismes sortants ou entrants d'un objet supprime "+str(objet))
raise Exception("Il reste des morphismes sortants ou entrants d'un objet auquel on a supprime tous les morphismes adjacents "+str(objet)+"\n"+\
'\n'.join(map(str,d.cat_source.morph_entrants[objet]))+"\n\n"+'\n'.join(map(str,d.cat_source.morph_sortants[objet])))
if TOUJOURS_VERIFIER_COHERENCE:
self.verifier_coherence()
......@@ -222,21 +221,21 @@ class Categorie:
if not morphisme.is_identite:
self.morph_entrants[morphisme.cible].remove(morphisme)
self.morph_sortants[morphisme.source].remove(morphisme)
while len(self.diagrammes) > 0:
for i in range(len(self.diagrammes)):
d = self.diagrammes[i]
if morphisme in [e for compo in d.app_morph.values() for e in compo]:
self.diagrammes.pop(i)
nouveau_sketch = Categorie()
nouveau_sketch.ajouter_objets(d.cat_source.objets)
nouveau_sketch.ajouter_morphismes([morph for morph in d.cat_source.morphismes if
morphisme not in d.app_morph[
morph] and not morph.is_identite])
nouveau_diagramme = Diagramme.Diagramme(nouveau_sketch, self, d.app_objets,
{cle: d.app_morph[cle] for cle in
nouveau_sketch.morphismes if not cle.is_identite})
nouveau_diagramme.faire_commuter()
break
while len(self.diagrammes) > 0:
for i in range(len(self.diagrammes)):
d = self.diagrammes[i]
if morphisme in [e for compo in d.app_morph.values() for e in compo]:
self.diagrammes.pop(i)
nouveau_sketch = Categorie()
nouveau_sketch.ajouter_objets(d.cat_source.objets)
nouveau_sketch.ajouter_morphismes([morph for morph in d.cat_source.morphismes if
morphisme not in d.app_morph[
morph] and not morph.is_identite])
nouveau_diagramme = Diagramme.Diagramme(nouveau_sketch, self, d.app_objets,
{cle: d.app_morph[cle] for cle in
nouveau_sketch.morphismes if not cle.is_identite})
nouveau_diagramme.faire_commuter()
break
else:
break
if TOUJOURS_VERIFIER_COHERENCE:
......
......@@ -25,7 +25,6 @@ class CategorieAlea(Categorie):
source = random.randint(0,nb_objets-1)
cible = random.randint(0,nb_objets-1)
self.ajouter_morphisme(Morphisme(source,cible,str(i)))
#on définit la loi de composition pour les cycles
for obj in self.objets:
cycles = self.trouver_cycles_elementaires(obj)
......@@ -49,6 +48,35 @@ class CategorieAlea(Categorie):
if PRINT_AVANCEMENT_CREATION_CAT_ALEA:
print("Fin création")
class CategorieAleaIsomorph(Categorie):
"""Construit une catégorie aléatoire où tous les cycles sont des isomorphismes."""
def __init__(self, nb_objets = None, nb_morph = None):
"""nb_morph est le nombre de morphismes élémentaires à ajouter aléatoirement."""
Categorie.__init__(self,"Catégorie aléatoire")
if nb_objets == None:
nb_objets = random.randint(5,20)
if nb_morph == None:
nb_morph = random.randint(0,30)
if PRINT_AVANCEMENT_CREATION_CAT_ALEA:
print("Création d'une catégorie avec "+str(nb_objets)+" objets et "+str(nb_morph)+" morphismes")
self.ajouter_objets(list(range(nb_objets))) #ajout des objets
i=1
while len(self.morphismes) < nb_morph+nb_objets: # ajout des morphismes
source = random.randint(0,nb_objets-1)
cible = random.randint(0,nb_objets-1)
if source != cible:
self.ajouter_morphisme(Morphisme(source,cible,str(i)))
i+=1
#on définit la loi de composition pour les cycles
for obj in self.objets:
cycles = self.trouver_cycles_elementaires(obj)
for c in cycles:
diag = Parallele(self,[obj]*2,[c,self.identites[obj]])
diag.faire_commuter()
if PRINT_AVANCEMENT_CREATION_CAT_ALEA:
print("Fin création")
class CategorieAleaPreOrdre(Categorie):
"""Construit une catégorie pré-ordre aléatoire."""
def __init__(self,nb_objets = None, proportion_morph = None, retirer_obj_isoles = True):
......
......@@ -56,6 +56,7 @@ class CategorieCones(Categorie):
print("CategorieCones l.48 : On a echappe a la creation du diagramme superflu "+str(self.Composee(*antecedant_nouveau))+" => "+str(self.Composee(*image_nouveau)))
# On retire ensuite les chemins en double
self.transformer_graphviz(complet=False)
composees = self.enumerer_toutes_composees()
for cone1,cone2 in composees:
comp = sorted([e for e in composees[(cone1,cone2)] if not e.is_identite],key=len)
......
......@@ -19,7 +19,9 @@ class Cocone():
return str(self.nadir)+','+'/'.join(map(lambda x:str(x.representant),self.jambes.values()))
def __eq__(self, other):
return self.nadir == other.nadir and self.jambes == other.jambes and self.foncteur == other.foncteur
if issubclass(type(other),Cocone):
return self.nadir == other.nadir and self.jambes == other.jambes and self.foncteur == other.foncteur
return False
def __hash__(self):
return super().__hash__()
......@@ -52,7 +54,7 @@ class Cocone():
graph.attr(label="Cocone "+image.nom)
for o in self.foncteur.cat_cible.objets:
if o == self.nadir:
graph.node(str(o), color="green")
graph.node(str(o), color="blue")
else:
graph.node(str(o))
fleches_implementation = image.enumerer_toutes_composees()
......@@ -89,8 +91,8 @@ def main():
cat = Categorie.Categorie("Test Cocone")
cat.ajouter_objets("ABCDE")
f,g,h,i,j = [Morphisme('A','B','f'),Morphisme('A','C','g'),Morphisme('B','D','h'),Morphisme('C','D','i'),Morphisme('B','E','j')]
cat.ajouter_morphismes([f,g,h,i,j])
f,g,h,i,j,k = [Morphisme('A','B','f'),Morphisme('A','C','g'),Morphisme('B','D','h'),Morphisme('C','D','i'),Morphisme('B','E','j'),Morphisme('D','E','k')]
cat.ajouter_morphismes([f,g,h,i,j,k])
diag = Diagramme.DiagrammeIdentite(cat)
diag.faire_commuter()
......
......@@ -190,6 +190,7 @@ class DiagrammeAlea(Diagramme):
nb_objets_restants = random.randint(1,len(cat_cible.objets))
cat_source = copy.copy(cat_cible)
obj_a_suppr = random.sample(cat_cible.objets,len(cat_cible.objets)-nb_objets_restants)
print(obj_a_suppr)
cat_source.supprimer_objets(obj_a_suppr)
if retirer_objets_isoles and len([obj for obj in cat_source.objets if not(len(cat_source.morph_sortants[obj]) == len(cat_source.morph_entrants[obj]) == 0)]) != 0:
cat_source.supprimer_objets([obj for obj in cat_source.objets if len(cat_source.morph_sortants[obj]) == len(cat_source.morph_entrants[obj]) == 0])
......
import Categorie
from Morphisme import Morphisme
import Diagramme
cat = Categorie.Categorie("Catégorie acyclique")
cat.ajouter_objets("ABCDEF")
f,g,h,i,j,k = [Morphisme('A','B','f'),Morphisme('A','C','g'),Morphisme('B','D','h'),Morphisme('B','E','i'),
Morphisme('C','E','j'),Morphisme('C','F','k')]
cat.ajouter_morphismes([f,g,h,i,j,k])
cat.transformer_graphviz()
diag = Diagramme.Carre(cat,"ABCE",[f,i,g,j])
diag.transformer_graphviz()
\ No newline at end of file
import Categorie,CategorieAleatoire
import Diagramme
import CategorieCones,CategorieCocones
import Bouquet
import random
random.seed(123455)
cat = CategorieAleatoire.CategorieAleaIsomorph()
cat.transformer_graphviz(complet=False)
cat.transformer_graphviz(complet=True)
diag = Diagramme.DiagrammeAlea(cat,1)
diag.transformer_graphviz()
cat_cones = CategorieCones.CategorieCones(diag)
cat_cones.transformer_graphviz()
for lim in cat_cones.limites():
lim.transformer_graphviz()
cat_cocones = CategorieCocones.CategorieCocones(diag)
cat_cocones.transformer_graphviz()
for lim in cat_cocones.colimites():
lim.transformer_graphviz()
\ No newline at end of file
- Ajouter morphisme -> renvoyer la liste des cycles créés ?
- Mettre en cache les composées enumérées dans catégorie
- Créer catégorie cocones
- Ajouter les conditions sur cocones dans Gerbe
- tester catégorie cones avec un diagramme où la catégorie indexante n'a pas de flèches (on est censé avoir toutes les permutations de jambes)
\ No newline at end of file
- tester catégorie cones avec un diagramme où la catégorie indexante n'a pas de flèches (on est censé avoir toutes les permutations de jambes)
- L200-205 Catégorie -> investiguer à quoi ça sert ?
\ 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