Commit 7c25f6be authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

Catégorie pré-ordre aléatoire

parent 0ea53266
......@@ -194,6 +194,10 @@ class Categorie:
self.objets.remove(objet)
if TOUJOURS_VERIFIER_COHERENCE:
self.verifier_coherence()
def supprimer_objets(self,objets):
for obj in copy.copy(objets):
self.supprimer_objet(obj)
def supprimer_morphisme(self, morphisme):
for elem_a_del in [e for e in self.Composee.loi_de_composition if
......@@ -530,6 +534,9 @@ class Categorie:
if afficher_identites or not morphisme.is_identite:
graph.edge(str(morphisme.source), str(morphisme.cible), label=str(morphisme.representant))
graph.render(destination)
if CLEAN_GRAPHVIZ_MODEL:
import os
os.remove("graphviz/categorie" + str(Categorie.nb_viz))
def main():
......
from Categorie import Categorie
from Morphisme import Morphisme
from Diagramme import Parallele
from Diagramme import Parallele,DiagrammeIdentite
import random
import copy
import itertools
......@@ -9,13 +9,15 @@ 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))):
def __init__(self, nb_objets = None, nb_morph = None, 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 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
......@@ -46,17 +48,70 @@ class CategorieAlea(Categorie):
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):
"""proportion morph est la proportion de morphismes de 0 (graphe sans flèche) à 1 (graphe complet)"""
if nb_objets == None:
nb_objets = random.randint(5,20)
if proportion_morph == None:
proportion_morph = min(random.expovariate(10),1)
nb_morph = max(int(proportion_morph*(nb_objets)*(nb_objets-1)/2),5) # min 5 morphismes
Categorie.__init__(self,"Catégorie pré-ordre aléatoire")
self.ajouter_objets(list(range(nb_objets))) #ajout des objets
i = 1
for source,cible in random.sample(list(itertools.product(range(nb_objets),repeat=2)),nb_morph): # ajout des morphismes
self.ajouter_morphisme(Morphisme(source,cible,str(i)))
i += 1
if retirer_obj_isoles:
self.retirer_noeuds_isoles()
diag = DiagrammeIdentite(self)
diag.faire_commuter()
def retirer_noeuds_isoles(self):
self.supprimer_objets([obj for obj in self.objets if len(self.morph_sortants[obj]) == len(self.morph_entrants[obj]) == 0])
class CategorieAleaPreOrdreAcyclique(Categorie):
"""Construit une catégorie pré-ordre aléatoire."""
def __init__(self,nb_objets = None, proportion_morph = None, retirer_obj_isoles = True):
"""proportion morph est la proportion de morphismes de 0 (graphe sans flèche) à 1 (graphe complet)"""
if nb_objets == None:
nb_objets = random.randint(5,20)
if proportion_morph == None:
proportion_morph = min(random.expovariate(10),1)
nb_morph = max(int(proportion_morph*(nb_objets)*(nb_objets-1)/2),5) # min 5 morphismes
Categorie.__init__(self,"Catégorie pré-ordre aléatoire")
self.ajouter_objets(list(range(nb_objets))) #ajout des objets
i = 1
for source,cible in random.sample(list(itertools.combinations(range(nb_objets),2)),nb_morph): # ajout des morphismes
self.ajouter_morphisme(Morphisme(source,cible,str(i)))
i += 1
if retirer_obj_isoles:
self.retirer_noeuds_isoles()
diag = DiagrammeIdentite(self)
diag.faire_commuter()
def retirer_noeuds_isoles(self):
self.supprimer_objets([obj for obj in self.objets if len(self.morph_sortants[obj]) == len(self.morph_entrants[obj]) == 0])
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()
# 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()
for i in range(10):
print("debut creation")
c = CategorieAleaPreOrdre(20,0.2)
print("fin creation")
c.transformer_graphviz(complet=False)
c.transformer_graphviz()
if __name__ == '__main__':
......
......@@ -71,6 +71,9 @@ class Cocone():
else:
graph.edge(str(couple[0]),str(couple[1]),label=str(c.representant),color="grey96")
graph.render(destination)
if CLEAN_GRAPHVIZ_MODEL:
import os
os.remove("graphviz/cocone"+str(Cocone.nb_viz))
def main():
import Diagramme
......
......@@ -71,6 +71,9 @@ class Cone():
else:
graph.edge(str(couple[0]),str(couple[1]),label=str(c.representant),color="grey96")
graph.render(destination)
if CLEAN_GRAPHVIZ_MODEL:
import os
os.remove("graphviz/cone"+str(Cone.nb_viz))
def main():
import Diagramme
......
......@@ -103,6 +103,9 @@ class Diagramme(Foncteur.Foncteur):
else:
graph.edge(str(f.source),str(f.cible),label=str(f.representant),color="grey60")
graph.render(destination)
if CLEAN_GRAPHVIZ_MODEL:
import os
os.remove("graphviz/diagramme"+str(Diagramme.nb_viz))
class Parallele(Diagramme):
_cat = Categorie.Categorie("Parallele")
......
......@@ -156,6 +156,9 @@ class Foncteur(Morphisme.Morphisme):
graph.render(destination)
if CLEAN_GRAPHVIZ_MODEL:
import os
os.remove("graphviz/foncteur"+str(Foncteur.nb_viz))
def categorie_image(self):
"""Renvoie la sous-catégorie image du foncteur."""
......
from Foncteur import Foncteur
from Morphisme import Morphisme
\ No newline at end of file
......@@ -90,6 +90,9 @@ class TransfoNat(Morphisme.Morphisme):
graph.edge(str(couple[0]),str(couple[1]),label=str(c.representant),color="grey70")
graph.render(destination)
if CLEAN_GRAPHVIZ_MODEL:
import os
os.remove("graphviz/transformation_naturelle"+str(TransfoNat.nb_viz))
def main():
......
......@@ -3,4 +3,5 @@ DEBUG_LOI_DE_COMPOSITION = False
GRAPHVIZ_ENABLED = True
GRAPHVIZ_CONCENTRATE_GRAPHS = False
MONTRER_AVANCEMENT_CATEGORIE_DIAGRAMMES = True
PRINT_AVANCEMENT_CREATION_CAT_ALEA = True
\ No newline at end of file
PRINT_AVANCEMENT_CREATION_CAT_ALEA = True
CLEAN_GRAPHVIZ_MODEL = 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