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

Corrections

parent ef59e61b
......@@ -424,7 +424,63 @@ class FoncteurAleatoireCatOrdreConnexe(Foncteur):
app_obj, app_morph = dict(),dict()
cat_ordre_total1,cat_ordre_total2 = CatOrdreTotal(cat1),CatOrdreTotal(cat2)
fonct_ordre_total = FoncteurAleatoireCatOrdreTotal(cat_ordre_total1,cat_ordre_total2)
fonct_ordre_total.as_diagram()
tri = cat_ordre_total1.tri_topologique()
for i in range(len(tri)-1):
morph_antecedant = next(cat_ordre_total1[{tri[i]},{tri[i+1]}])
morph_image = fonct_ordre_total(morph_antecedant)
sous_cat_ante = morph_antecedant.sous_cat_equiv()
sous_cat_image = morph_image.sous_cat_equiv()
cat_ante_cc = CatCC(sous_cat_ante)
cat_cible_cc = CatCC(sous_cat_image)
d
fonct_cc = FoncteurAleatoireCatCC(cat_ante_cc,cat_cible_cc)
for cc1 in cat_ante_cc.objets:
cc2 = fonct_cc(cc1)
cat_ante = cat_ante_cc.sous_cat_equiv(cc1)
cat_cible = cat_cible_cc.sous_cat_equiv(cc2)
# cat_ante et cat_cible sont connexes et bipartite
morph = None
for f in cat_ante[cat_ante.objets,cat_ante.objets]:
if not f.is_identite:
morph = f
print("*****")
print(morph)
break
if morph == None:
#il n'y a qu'une identité dans cat1 (il ne peut pas y en avoir plusieurs puisqu'on est dans une composante connexe)
app_obj[list(cat_ante.objets)[0]] = random.choice(list(cat_cible.objets))
else:
# on doit mapper le morphisme morph
fleches_deja_map = {morph}
fleches_a_map = {f for f in cat_ante(cat_ante.objets,cat_ante.objets) if not f.is_identite} - fleches_deja_map
fleches_cat_cible = list(cat_cible(cat_cible.objets,cat_cible.objets))
app_morph[morph] = random.choice(fleches_cat_cible)
app_obj[morph.source] = app_morph[morph].source
app_obj[morph.cible] = app_morph[morph].cible
cat_ante.transformer_graphviz()
cat_cible.transformer_graphviz()
while len(fleches_a_map) > 0:
for f in fleches_a_map:
if f.source in app_obj or f.cible in app_obj:
sources_possibles,cibles_possibles = cat_cible.objets,cat_cible.objets
if f.source in app_obj:
sources_possibles = {app_obj[f.source]}
if f.cible in app_obj:
cibles_possibles = {app_obj[f.cible]}
print(sources_possibles,cibles_possibles)
app_morph[f] = random.choice(list(cat_cible(sources_possibles,cibles_possibles)))
app_obj[f.source] = app_morph[f].source
app_obj[f.cible] = app_morph[f].cible
fleches_deja_map |= {f}
fleches_a_map -= {f}
break
else:
# aucune contrainte de sommet n'a été trouvée
# incohérent avec le fait qu'on soit dans une composante connexe
raise Exception("Aucune contrainte de source ou de cible trouvée")
Foncteur.__init__(self,cat1,cat2,app_obj,app_morph)
......@@ -433,19 +489,37 @@ def test_FoncteurAleatoireCatOrdreConnexe():
import random
random.seed(4)
c1,c2 = GrapheCompositionAleatoire(),GrapheCompositionAleatoire()
c1,c2 = GrapheCompositionAleatoire(20,150),GrapheCompositionAleatoire()
c1.transformer_graphviz()
c2.transformer_graphviz()
c1,c2 = CatCC(c1),CatCC(c2)
c1.transformer_graphviz()
c2.transformer_graphviz()
c1_,c2_ = CatFine(CatAcyclique(c1.sous_cat_equiv(list(c1.objets)[0]))),CatFine(CatAcyclique(c2.sous_cat_equiv(list(c2.objets)[0])))
# c1.transformer_graphviz()
# c2.transformer_graphviz()
c1_,c2_ = CatOrdre(c1.sous_cat_equiv(list(c1.objets)[0])),CatOrdre(c2.sous_cat_equiv(list(c2.objets)[0]))
c1_.transformer_graphviz()
c2_.transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
f = FoncteurAleatoireCatOrdreConnexe(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
class FoncteurAleatoireCatAcycliques(Foncteur):
"""Foncteur aléatoire entre deux catégories acycliques."""
......@@ -587,9 +661,9 @@ def test_FoncteurAleatoire():
if __name__ == '__main__':
# test_GrapheCompositionAleatoire()
test_GrapheCompositionAleatoire()
# test_MonoideGC()
# test_FoncteurCCAleatoire()
# test_FoncteurCatAcycliqueAleatoire()
# test_FoncteurAleatoireCatFineAcycliqueConnexe()
test_FoncteurAleatoireCatOrdreTotal()
\ No newline at end of file
# test_FoncteurAleatoireCatOrdreConnexe()
# test_FoncteurAleatoireCatOrdreTotal()
\ No newline at end of file
......@@ -24,7 +24,8 @@ class MorphismePreordre(Morphisme):
MPO = MorphismePreordre
class CategoriePreordre(Categorie):
"""CategoriePreordre peut être abrégé en CatFine.
"""Catégorie similaire à `CatFine`, `CategoriePreordre` ne garde pas en mémoire tous les morphismes qui ont été réunis en un.
`CategoriePreordre` est donc moins coûteux en temps et en mémoire que `CatFine`.
Classe abstraite qui définit ce qu'est une catégorie préordre.
Les classes filles doivent implémenter la méthode existe_morphisme(self,source:Any,cible:Any) -> Union(Morphisme,None) qui détermine
entièrement les flèches de la catégorie.
......@@ -57,7 +58,6 @@ class CategoriePreordre(Categorie):
yield MorphismePreordre(source,cible)
CatFine = CategoriePreordre
class CategoriePreordreEngendree(CategoriePreordre):
"""La catégorie préordre engendrée par une catégorie C est une sous-catégorie maximale C' de C
......
......@@ -76,10 +76,14 @@ class ChampActif(CommaCategorie):
# ici cocone_courant est un objet initial de la catégorie
result = set()
for cocone in self.objets:
generateur = self({cocone_courant},{cocone}) #permet de vérifier qu'il n'y a pas plus d'une flèche entre les deux cocones
next(generateur,None)
if self.existe_isomorphisme(cocone_courant,cocone) != None:
result |= {cocone}
elif self.existe_morphisme(cocone_courant,cocone) == None:
return set()
return set()
elif cocone != cocone_courant and next(generateur,None) != None:
return set()
return result
def test_ChampActif():
......@@ -92,10 +96,11 @@ def test_ChampActif():
gc |= {f,g,h,i,j,k,l}
diag_identite = DiagrammeIdentite(gc)
diag_identite.faire_commuter()
# diag_identite.faire_commuter()
gc.transformer_graphviz()
d1 = Triangle(gc,"ABC",[f,g,g@f])
d1.transformer_graphviz()
c_p = ChampActif(d1)
for cocone in c_p.objets_cocones(gc.objets):
Cocone(cocone).transformer_graphviz()
......
......@@ -73,10 +73,14 @@ class ChampPerceptif(CommaCategorie):
# ici cone_courant est un objet final de la catégorie
result = set()
for cone in self.objets:
generateur = self({cone},{cone_courant}) #permet de vérifier qu'il n'y a pas plus d'une flèche entre les deux cones
next(generateur,None)
if self.existe_isomorphisme(cone_courant,cone) != None:
result |= {cone}
elif self.existe_morphisme(cone,cone_courant) == None:
return set()
return set()
elif cone != cone_courant and next(generateur,None) != None:
return set()
return result
......
......@@ -195,7 +195,7 @@ class CategorieBijections(EnsFinis):
yield Bijection(source,cible,{source_liste[j]:rotation[j] for j in range(len(source_liste))})
def test_EnsFinis():
cat = EnsFinis(set(map(frozenset,[{},{1,2},{3,4,5}])))
cat = EnsFinis(set(map(frozenset,[{},{1,2},{3,4,5},{6}])))
cat.transformer_graphviz(limite_fleches=243,complet=False)
cat.transformer_graphviz(limite_fleches=243,complet=True)
# for source,cible in itertools.product(cat.objets,repeat=2):
......@@ -216,7 +216,7 @@ def test_EnsParties():
app.transformer_graphviz()
def test_CategorieBijections():
cat = EnsParties({1,2,3})
cat = EnsParties({1,2,3,4})
cat = CategorieBijections(cat.objets)
for bij in cat[{frozenset({1,2,3})},{frozenset("123")}]:
bij.transformer_graphviz()
......@@ -224,5 +224,5 @@ def test_CategorieBijections():
if __name__ == '__main__':
test_EnsFinis()
# test_EnsParties()
# test_CategorieBijections()
\ No newline at end of file
test_EnsParties()
test_CategorieBijections()
\ No newline at end of file
TOUJOURS_VERIFIER_COHERENCE = 1 # booléen qui indique si on doit toujours vérifier la cohérence des structures qu'on construit
TOUJOURS_VERIFIER_COHERENCE = 0 # booléen qui indique si on doit toujours vérifier la cohérence des structures qu'on construit
TOUJOURS_VERIFIER_COHERENCE_COMPOSEE = 1
DEBUG_LOI_DE_COMPOSITION = False
GRAPHVIZ_ENABLED = True # booléen qui indique s'il faut charger la bibliothèque graphviz
......@@ -6,5 +6,5 @@ GRAPHVIZ_CONCENTRATE_GRAPHS = False
WARNING_LIMITE_FLECHES_ATTEINTE = True
WARNING_CATEGORIE_QUOTIENT = True
PRINT_AVANCEMENT_CREATION_CAT_ALEA = True
CLEAN_GRAPHVIZ_MODEL = True
CLEAN_GRAPHVIZ_MODEL = False
PROGRESS_BAR = True
\ No newline at end of file
Markdown is supported
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