Commit 8d319b78 authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

FoncteurAleatoireCatOrdreConnexe fonctionnel

parent f4ffe8c7
......@@ -421,67 +421,61 @@ class FoncteurAleatoireCatOrdreConnexe(Foncteur):
assert(len(CatCC(categorie_indexante).objets) == 1) # on vérifie qu'il n'y a qu'une seule composante connexe
assert(len(CatCC(categorie_cible).objets) == 1) # on vérifie qu'il n'y a qu'une seule composante connexe
cat1,cat2 = categorie_indexante,categorie_cible
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")
if len(cat1.objets) == 1:
Foncteur.__init__(self,cat1,cat2,{obj:random.choice(cat2.objets) for obj in cat1.objets},dict())
else: # on a au moins une flèche dans la catégorie indexante
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)
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()
fleches_deja_map = set()
fleches_a_map = {f for f in sous_cat_ante[sous_cat_ante.objets,sous_cat_ante.objets] if not f.is_identite}
fleches_cat_cible = list(sous_cat_image(sous_cat_image.objets,sous_cat_image.objets))
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 = sous_cat_image.objets,sous_cat_image.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]}
app_morph[f] = random.choice(list(cat2(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: # on a trouvé aucune contrainte de source ou de cible
if i != 0:
raise Exception("Aucune contrainte de source ou de cible au rang > 0 du tri "+str(i))
morph = fleches_a_map.pop()
app_morph[morph] = random.choice(fleches_cat_cible)
app_obj[morph.source] = app_morph[morph].source
app_obj[morph.cible] = app_morph[morph].cible
fleches_a_map = {f for f in cat1[cat1.objets,cat1.objets] if not f.is_identite and f not in fleches_deja_map}
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 = cat2.objets,cat2.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]}
app_morph[f] = random.choice(list(cat2(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: # on a trouvé aucune contrainte de source ou de cible
raise Exception("Aucune contrainte de source ou de cible au rang > 0 du tri "+str(i))
Foncteur.__init__(self,cat1,cat2,app_obj,app_morph)
Foncteur.__init__(self,cat1,cat2,app_obj,app_morph)
......@@ -661,9 +655,9 @@ def test_FoncteurAleatoire():
if __name__ == '__main__':
test_GrapheCompositionAleatoire()
# test_GrapheCompositionAleatoire()
# test_MonoideGC()
# test_FoncteurCCAleatoire()
# test_FoncteurCatAcycliqueAleatoire()
# test_FoncteurAleatoireCatOrdreConnexe()
test_FoncteurAleatoireCatOrdreConnexe()
# test_FoncteurAleatoireCatOrdreTotal()
\ No newline at end of file
......@@ -100,7 +100,7 @@ class Diagramme(Foncteur):
for f in generateur:
if not f.is_identite or afficher_identite:
if f in image_morph:
couleur = [max(255-(image_morph_count[f]-1)*75,0),max(165-(image_morph_count[f]-1)*50,0),0]
couleur = [max(255-(image_morph_count[f]-1)*75,150),max(165-(image_morph_count[f]-1)*50,0),0]
graph.edge(str(f.source),str(f.cible),label=str(f), weight="1000", color="#"+''.join(map(lambda x:(2-len(str(hex(x))[2:]))*"0"+str(hex(x))[2:],couleur)))
elif f in fleches_elem:
graph.edge(str(f.source),str(f.cible),label=str(f),color="black")
......
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 = 1 # 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 = False
CLEAN_GRAPHVIZ_MODEL = True
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