Commit 0ea53266 authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

Categorie Aléatoire

parent 5be4ed1a
......@@ -201,7 +201,6 @@ class Categorie:
del self.Composee.loi_de_composition[elem_a_del]
if morphisme in self.Composee.loi_de_composition:
del self.Composee.loi_de_composition[morphisme]
self.morphismes.remove(morphisme)
if not morphisme.is_identite:
self.morph_entrants[morphisme.cible].remove(morphisme)
......@@ -368,8 +367,7 @@ class Categorie:
for noeud in c.objets_traverses():
if len(cycles_noeuds[noeud]) > 0:
noeuds_impliques += [noeud]
cycles_impliques += [cycles_noeuds[
noeud]] # on rajoute une identité pour la possibilité de pas rajouter le cycle
cycles_impliques += [cycles_noeuds[noeud]] # on rajoute une identité pour la possibilité de pas rajouter le cycle
if len(cycles_impliques) > 0:
for prod in itertools.product(*cycles_impliques):
morphismes = []
......@@ -593,8 +591,8 @@ def main():
cones = fonct.enumerer_cones(obj)
for c in cones:
c.transformer_graphviz()
cat3 = fonct.categorie_cones()
from CategorieCones import CategorieCones
cat3 = CategorieCones(fonct)
cat3.transformer_graphviz()
cat = Categorie("Test table loi de composition")
......
from Categorie import Categorie
from Morphisme import Morphisme
from Diagramme import Parallele
import random
import copy
import itertools
from config import *
class CategorieAlea(Categorie):
"""Construit une catégorie aléatoire."""
def __init__(self, nb_objets = lambda:random.randint(5,20), nb_morph = lambda:random.randint(0,30), fonct_masse_nb_branchements_cycles = lambda:int(random.expovariate(2))):
"""nb_morph est le nombre de morphismes élémentaires à ajouter aléatoirement.
La fonction de masse permet de gérer le cas de la composition des différents cycles,
le nombre donne le nombre de fois qu'on s'autorise à brancher sur l'arbre de composition."""
Categorie.__init__(self,"Catégorie aléatoire")
nb_objets = nb_objets()
nb_morph = nb_morph()
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
for i in range(nb_morph): # ajout des morphismes
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)
arbre_complet = cycles + [self.identites[obj]]
feuilles = [self.Composee(*couple) for couple in itertools.product(cycles,repeat=2)]
arbre_complet += feuilles
if len(cycles) > 0:
nb_branchement = fonct_masse_nb_branchements_cycles()
if PRINT_AVANCEMENT_CREATION_CAT_ALEA:
print("nombre de branchement pour l'objet "+str(obj)+" : "+str(nb_branchement))
print("nombre de cycles : "+str(len(cycles)))
for i in range(nb_branchement):
c = random.choice(feuilles)
feuilles.remove(c)
feuilles += [self.Composee(c,e) for e in cycles]
arbre_complet += [self.Composee(c,e) for e in cycles]
for c in feuilles:
image = random.choice([e for e in arbre_complet if len(e) < len(c)])
diag = Parallele(self,[obj]*2,[c,image])
diag.faire_commuter()
if PRINT_AVANCEMENT_CREATION_CAT_ALEA:
print("Fin création")
def main():
random.seed(2579)
c = CategorieAlea()
c.transformer_graphviz(complet=False)
from CategoriePreordre import CategoriePreordre
c2 = CategoriePreordre(c)
c2.transformer_graphviz()
c.pretty_print_loi_de_composition(destination="graphviz/loi_de_comp.txt")
c.verifier_coherence()
c2.verifier_coherence()
if __name__ == '__main__':
main()
\ No newline at end of file
......@@ -114,38 +114,49 @@ class CategorieCones(Categorie):
def main():
from Diagramme import DiagrammeIdentite
# from Diagramme import DiagrammeIdentite
# cat1 = Categorie('Catégorie à 1 flèche')
# cat1.ajouter_objets("AB")
# f = Morphisme('A','B','f')
# cat1.ajouter_morphismes([f])
# cat2 = Categorie('Catégorie double cône')
# cat2.ajouter_objets("ABCD")
# f1,f2,f3,f4,f5,f6,f7 = [Morphisme('A','B',1),Morphisme('A','C',2),Morphisme('D','B',3),Morphisme('D','C',4),
# Morphisme('B','C',5),Morphisme('A','D',6),Morphisme('A','A',7)]
# cat2.ajouter_morphismes([f1,f2,f3,f4,f5,f6])
# d = DiagrammeIdentite(cat2)
# d.faire_commuter()
# cat2.ajouter_morphisme(f7)
# d = Triangle(cat2,"AAA",[cat2.Composee(f7,f7),cat2.identites['A'],f7])
# d.faire_commuter()
# cat2.transformer_graphviz()
# F = Foncteur(cat1,cat2,{'A':'B','B':'C'},{f:f5})
# F.transformer_graphviz()
# cat3 = CategorieCones(F)
# for d in cat3.diagrammes:
# Foncteur.transformer_graphviz(d)
# cat3.transformer_graphviz()
# for cone in cat3.objets:
# cone.transformer_graphviz()
from CategorieAleatoire import CategorieAlea
c = CategorieAlea(lambda:5,lambda:7)
c.transformer_graphviz()
cat1 = Categorie('Catégorie à 1 flèche')
cat1.ajouter_objets("AB")
f = Morphisme('A','B','f')
cat1.ajouter_morphismes([f])
cat2 = Categorie('Catégorie double cône')
cat2.ajouter_objets("ABCD")
f1,f2,f3,f4,f5,f6,f7 = [Morphisme('A','B',1),Morphisme('A','C',2),Morphisme('D','B',3),Morphisme('D','C',4),
Morphisme('B','C',5),Morphisme('A','D',6),Morphisme('A','A',7)]
cat2.ajouter_morphismes([f1,f2,f3,f4,f5,f6])
d = DiagrammeIdentite(cat2)
d.faire_commuter()
cat2.ajouter_morphisme(f7)
d = Triangle(cat2,"AAA",[cat2.Composee(f7,f7),cat2.identites['A'],f7])
d.faire_commuter()
cat2.transformer_graphviz()
F = Foncteur(cat1,cat2,{'A':'B','B':'C'},{f:f5})
F.transformer_graphviz()
F = Foncteur(cat1,c,{'A':c.morphismes[10].source,'B':c.morphismes[10].cible},{f:c.morphismes[10]})
cat3 = CategorieCones(F)
for d in cat3.diagrammes:
Foncteur.transformer_graphviz(d)
cat3.transformer_graphviz()
for cone in cat3.objets:
cone.transformer_graphviz()
lim = cat3.limites()
for l in lim:
l.transformer_graphviz(destination="graphviz/limite"+str(lim.index(l)))
for o in cat3.objets:
o.transformer_graphviz()
if __name__ =='__main__':
main()
\ No newline at end of file
......@@ -39,24 +39,35 @@ class Diagramme(Foncteur.Foncteur):
composees = cat_index.enumerer_toutes_composees()
for couple in composees:
composees_sans_id = [e for e in composees[couple] if not e.is_identite]
morph_elem = [e for e in composees_sans_id if len(e.composee) == 1]
if len(morph_elem) > 1: #deux morphismes élémentaires identifiés
#on supprime les flèches en trop
for m in morph_elem[1:]:
cat_index.supprimer_morphisme(m)
if self(m) != morph_elem[0]:
self.categorie_indexee.supprimer_morphisme(self(m))
composees = cat_index.enumerer_toutes_composees()
composees_sans_id = [e for e in composees[couple] if not e.is_identite]
# morph_elem = [e for e in composees_sans_id if len(e.composee) == 1]
# if len(morph_elem) > 1: #deux morphismes élémentaires identifiés
# for e in morph_elem:
# print(e)
# on supprime les flèches en trop
# for m in morph_elem[1:]:
# cat_index.supprimer_morphisme(m)
# if self(m) != morph_elem[0]:
# self.categorie_indexee.supprimer_morphisme(self(m))
# composees = cat_index.enumerer_toutes_composees()
# composees_sans_id = [e for e in composees[couple] if not e.is_identite]
if len(composees_sans_id) >= 2:
ajout_loi_de_compo = True
composees_triees = sorted(composees_sans_id, key=len)
composees_triees = sorted(list(map(lambda x:self.categorie_indexee.Composee(*[self.app_morph[e] for e in x]),composees_sans_id)), key=len)
for c in composees_triees[1:]:
composee_depart = self.categorie_indexee.Composee(*[self.app_morph[e] for e in c])
composee_arrivee = self.categorie_indexee.Composee(*[self.app_morph[e] for e in composees_triees[0]])
composee_depart = c
composee_arrivee = composees_triees[0]
if composee_depart.is_identite:
composee_depart,composee_arrivee = composee_arrivee,composee_depart
if composee_depart != composee_arrivee:
self.categorie_indexee.Composee.loi_de_composition[composee_depart] = composee_arrivee
if len(composee_depart) == len(composee_arrivee) == 1:
print("Warning : Identification de deux fleches elementaires : "+str(composee_depart)+" et "+str(composee_arrivee))
if composee_depart.is_identite:
raise Exception("Identification d'une identite a un morphisme : "+str(composee_depart)+" et "+str(composee_arrivee))
else:
self.categorie_indexee.supprimer_morphisme(composee_depart)
else:
self.categorie_indexee.Composee.loi_de_composition[composee_depart] = composee_arrivee
if self not in self.categorie_indexee.diagrammes and ajout_loi_de_compo:
......@@ -92,7 +103,26 @@ class Diagramme(Foncteur.Foncteur):
else:
graph.edge(str(f.source),str(f.cible),label=str(f.representant),color="grey60")
graph.render(destination)
class Parallele(Diagramme):
_cat = Categorie.Categorie("Parallele")
_cat.ajouter_objets([1,2])
f = Morphisme(1,2,'f')
g = Morphisme(1,2,'g')
morphismes = [f,g]
_cat.ajouter_morphismes(morphismes)
def __init__(self, categorie_indexee, image_objets, image_morphismes):
""" 1 ---> 2
f,g
image_objets et image_morphismes sont des listes dans l'ordre tels que les images
des objets [1,2] et des morphismes [f,g] soient dans l'ordre.
"""
app_objets = {i+1:image_objets[i] for i in range(len(image_objets))}
app_morph = {Parallele.morphismes[i]:image_morphismes[i] for i in range(len(image_morphismes))}
Diagramme.__init__(self,Parallele._cat,categorie_indexee,app_objets,app_morph)
class Triangle(Diagramme):
_cat = Categorie.Categorie("Triangle")
_cat.ajouter_objets([1,2,3])
......
TOUJOURS_VERIFIER_COHERENCE = True
TOUJOURS_VERIFIER_COHERENCE = 0
DEBUG_LOI_DE_COMPOSITION = False
GRAPHVIZ_ENABLED = True
GRAPHVIZ_CONCENTRATE_GRAPHS = False
MONTRER_AVANCEMENT_CATEGORIE_DIAGRAMMES = True
\ No newline at end of file
MONTRER_AVANCEMENT_CATEGORIE_DIAGRAMMES = True
PRINT_AVANCEMENT_CREATION_CAT_ALEA = True
\ 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