Commit 1836adee authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

Correction de complexification et de objets_colimites

parent 91cc4061
......@@ -151,7 +151,7 @@ class GrapheCompositionAleatoire(GC):
if nouvelle_loi.table[(f,g)] == None:
# problème de composition
for k in range(nb_tentatives):
nouvelle_loi2 = tentative_complexification(nouvelle_loi,f,g,nb_tentatives-int(not random.randint(0,2))) #on tente de complexifier
nouvelle_loi2 = tentative_complexification(nouvelle_loi,f,g,nb_tentatives-1) #on tente de complexifier
if nouvelle_loi2 != None:
nouvelle_loi = nouvelle_loi2
break
......@@ -344,8 +344,8 @@ def test_MonoideGC():
mon.loi_de_composition_to_csv(destination="lois de composition/monoide.csv")
class FoncteurAleatoire(Foncteur):
"""Foncteur aléatoire sur une catégorie."""
#class FoncteurAleatoire(Foncteur):
# """Foncteur aléatoire sur une catégorie."""
# def __new__(cls, categorie_indexante:Categorie = None, categorie_cible:Categorie = None, nom:str = None):
# if nom == None:
# nom = "Foncteur aléatoire sur "+str(categorie_cible)
......@@ -363,37 +363,46 @@ class FoncteurAleatoire(Foncteur):
categorie_indexante = GrapheCompositionAleatoire()
if categorie_cible == None:
categorie_cible = GrapheCompositionAleatoire()
categorie_indexante.transformer_graphviz()
categorie_cible.transformer_graphviz()
app_obj = dict()
app_morph = dict()
fleches_a_mapper = set(categorie_indexante[categorie_indexante.objets,categorie_indexante.objets])
fleches_cibles = set(categorie_cible(categorie_cible.objets,categorie_cible.objets))
while len(fleches_a_mapper) > 0:
fleche = fleches_a_mapper.pop()
image = random.choice(list(fleches_cibles))
app_morph[fleche] = image
nouvelles_fleches_mappees = {fleche}
if not fleche.is_identite:
sources_image_possibles = categorie_cible.objets
cibles_image_possibles = categorie_cible.objets
if fleche.source in app_obj:
sources_image_possibles = {app_obj[fleche.source]}
if fleche.cible in app_obj:
cibles_image_possibles = {app_obj[fleche.cible]}
image = random.choice(list(categorie_cible(sources_image_possibles,cibles_image_possibles)))
app_morph[fleche] = image
app_obj[fleche.source] = image.source
app_obj[fleche.cible] = image.cible
else:
image = random.choice([categorie_cible.identite(obj) for obj in categorie_cible.objets])
app_morph[fleche] = image
app_obj[fleche.source] = image.source
while True:
for fleche in fleches_a_mapper:
for fleche_deja_mappee in nouvelles_fleches_mappees:
if fleche.cible == fleche_deja_mappee.source:
fleches_a_mapper -= {fleche}
nouvelles_fleches_mappees |= {fleche}
image = random.choice([f for f in fleches_cibles if f.cible == app_morph[fleche_deja_mappee].source])
app_morph[fleche] = image
break
if fleche.source == fleche_deja_mappee.cible:
fleches_a_mapper -= {fleche}
nouvelles_fleches_mappees |= {fleche}
image = random.choice([f for f in fleches_cibles if f.source == app_morph[fleche_deja_mappee].cible])
app_morph[fleche] = image
break
else:
continue
break
declencher = False
sources_image_possibles = categorie_cible.objets
cibles_image_possibles = categorie_cible.objets
if fleche.cible in app_obj:
cibles_image_possibles = app_obj[fleche.cible]
declencher = True
if fleche.source in app_obj:
sources_image_possibles = app_obj[fleche.source]
declencer = True
if declencher:
fleches_a_mapper -= {fleche}
# image = random.choice([f for f in fleches_cibles if f.cible in ])
app_morph[fleche] = image
else:
break
......@@ -410,6 +419,6 @@ def test_FoncteurAleatoire():
if __name__ == '__main__':
# test_GrapheCompositionAleatoire()
test_GrapheCompositionAleatoire()
# test_MonoideGC()
test_FoncteurAleatoire()
\ No newline at end of file
# test_FoncteurAleatoire()
\ No newline at end of file
......@@ -99,5 +99,5 @@ def test_CategorieCatComposantesConnexes():
C.transformer_graphviz()
if __name__ == '__main__':
# test_CategorieComposantesConnexes()
test_CategorieCatComposantesConnexes()
\ No newline at end of file
test_CategorieComposantesConnexes()
# test_CategorieCatComposantesConnexes()
\ No newline at end of file
......@@ -74,7 +74,13 @@ class ChampActif(CommaCategorie):
if fleche_accessible == None:
fleche_accessible = next(self(cocones_restants,{cocone_courant}),None)
# ici cocone_courant est un objet initial de la catégorie
return {cocone for cocone in self.objets if self.existe_isomorphisme(cocone_courant,cocone) != None}
result = set()
for cocone in self.objets:
if self.existe_isomorphisme(cocone_courant,cocone) != None:
result |= {cocone}
elif self.existe_morphisme(cocone_courant,cocone) == None:
return set()
return result
def test_ChampActif():
from GrapheDeComposition import GC,MGC
......
......@@ -71,7 +71,13 @@ class ChampPerceptif(CommaCategorie):
if fleche_accessible == None:
fleche_accessible = next(self({cone_courant},cones_restants),None)
# ici cone_courant est un objet final de la catégorie
return {cone for cone in self.objets if self.existe_isomorphisme(cone_courant,cone) != None}
result = set()
for cone in self.objets:
if self.existe_isomorphisme(cone_courant,cone) != None:
result |= {cone}
elif self.existe_morphisme(cone,cone_courant) == None:
return set()
return result
def test_ChampPerceptif():
......
......@@ -9,10 +9,15 @@ from copy import copy
from TransformationNaturelle import TransfoNat
from typing import *
cat = GC(set("ABC"))
f,g = [MGC('A','B','f'),MGC('C','B','g')]
cat |= {f,g}
cat_i = GC(set("ABC"))
f_i,g_i = [MGC('B','A','f'),MGC('B','C','g')]
cat_i |= {f_i,g_i}
cat = GC(set("ABCDE"))
f,g,h,i,j,k,l,m = [MGC('B','A','f'),MGC('B','C','g'),MGC('A','D','h'),MGC('B','D','i'),MGC('C','D','j'),MGC('A','E','k'),MGC('B','E','l'),MGC('C','E','m')]
cat |= {f,g,h,i,j,k,l,m}
diag = Diagramme(cat_i,cat,{'A':'A','B':'B','C':'C'},{f_i:f,g_i:g})
def modification(gc: GC, option_ajout:Tuple[Sequence[Any],Sequence[Morphisme]] = (set(),set()), option_elimination:Sequence[Diagramme] = set(), option_complex_agissante:Sequence[Diagramme] = set(), option_complex_classifiante:Sequence[Diagramme] = set()) -> Tuple[GC,Foncteur]:
nouveau_gc = copy(gc)
......@@ -44,9 +49,9 @@ def modification(gc: GC, option_ajout:Tuple[Sequence[Any],Sequence[Morphisme]] =
for cocone in c_a.objets:
cocone = Cocone(cocone)
nouvelle_fleche = MGC(nouvel_objet,cocone.nadir)
for fleche_i in diag.source[diag.source.objets, diag.source.objets]:
if dico_index_jambe[fleche_i.source] != cocone(fleche_i.cible)@diag(fleche_i):
MGC.identifier_morphismes(cocone(fleche_i.cible)@diag(fleche_i),dico_index_jambe[fleche_i.source])
nouveau_gc |= {nouvelle_fleche}
for i in diag.source.objets:
MGC.identifier_morphismes(nouvelle_fleche@dico_index_jambe[i],cocone(i))
break
else:
for diag in option_complex_classifiante:
......@@ -70,27 +75,32 @@ def modification(gc: GC, option_ajout:Tuple[Sequence[Any],Sequence[Morphisme]] =
#ajouter les flèches depuis les autres cônes
for cone in c_p.objets:
cone = Cone(cone)
nouvelle_fleche = MGC(cocone.apex,nouvel_objet)
for fleche_i in diag.source[diag.source.objets, diag.source.objets]:
if cone(fleche_i.source) != dico_index_jambe[fleche_i.cible]@diag(fleche_i):
MGC.identifier_morphismes(dico_index_jambe[fleche_i.cible]@diag(fleche_i),cone(fleche_i.source))
nouvelle_fleche = MGC(cone.apex,nouvel_objet)
nouveau_gc |= {nouvelle_fleche}
for i in diag.source.objets:
MGC.identifier_morphismes(dico_index_jambe[i]@nouvelle_fleche,cone(i))
break
else:
break # si on a rien ajouté on peut enfin sortir
return nouveau_gc,fonct
diag2 = DiagrammeIdentite(cat)
diag2.faire_commuter()
diag.transformer_graphviz()
cat.transformer_graphviz()
h = MGC('S','T','h')
diag = DiagrammeIdentite(cat)
cat2,fonct = modification(cat,({'S','T'},{h}),{},{diag},{diag})
ChampActif(diag).transformer_graphviz()
cat2,fonct = modification(cat,(set(),set()),{},{diag},{diag})
cat2.transformer_graphviz()
fonct.transformer_graphviz()
diag = fonct@diag
diag.transformer_graphviz()
ChampPerceptif(diag).transformer_graphviz()
for cone in ChampPerceptif(diag).objets:
Cone(cone).transformer_graphviz()
ChampActif(diag).transformer_graphviz()
for cone in ChampActif(diag).objets_colimites():
Cocone(cone).transformer_graphviz()
\ No newline at end of file
......@@ -78,7 +78,7 @@ class Foncteur(Morphisme):
for objet in self.source.objets:
if self._app_morph[self.source.identite(objet)] != self.cible.identite(self._app_objets[objet]):
raise Exception("Incoherence foncteur : l'image de l'identite de "+str(objet)+" ("+str(self.source.identite(objet))+\
") n'est pas l'identite de l'image de l'objet ("+str(self.cible.identite(self._app_objets[objet]))+")")
") n'est pas l'identite de l'image de l'objet "+str(self._app_objets[objet])+"("+str(self.cible.identite(self._app_objets[objet]))+")\n"+str(self._app_morph))
## Images de deux flèches composables sont composables
for m1,m2 in itertools.product(self._app_morph,repeat=2):
......
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 = 0
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
GRAPHVIZ_CONCENTRATE_GRAPHS = False
......
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