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

Algo de modification mixte terminé

parent cb1e5c12
......@@ -41,7 +41,7 @@ class ChampPerceptif(CommaCategorie):
self.foncteur_vers_D = DiagrammeObjets(self.categorie_diagrammes,{diagramme})
CommaCategorie.__init__(self,self.foncteur_diagonal,self.foncteur_vers_D, "Champ perceptif de "+str(diagramme)+" ("+str(Categorie._id)+")" if nom == None else nom)
CommaCategorie.__init__(self,self.foncteur_diagonal,self.foncteur_vers_D, "Champ perceptif de "+str(diagramme) if nom == None else nom)
def objets_cones(self,apices:set) -> set:
"""`apices` est un ensemble d'objets de Q
......@@ -60,12 +60,16 @@ class ChampPerceptif(CommaCategorie):
cone_courant = cones[0]
cones_visites = {cone_courant}
cones_restants = self.objets-cones_visites
fleche_accessible = next(self({cone_courant},cones_restants),None)
fleche_accessible = next(self[{cone_courant},cones_restants],None)
if fleche_accessible == None:
fleche_accessible = next(self({cone_courant},cones_restants),None)
while fleche_accessible != None:
cone_courant = fleche_accessible.cible
cones_visites |= {cone_courant}
cones_restants = self.objets-cones_visites
fleche_accessible = next(self({cone_courant},cones_restants),None)
fleche_accessible = next(self[{cone_courant},cones_restants],None)
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}
......
......@@ -4,64 +4,93 @@ from Morphisme import Morphisme
from GrapheDeComposition import GC,MGC
from Diagramme import Diagramme, DiagrammeIdentite, Fleche
from ChampActif import ChampActif,Cocone
from ChampPerceptif import ChampPerceptif,Cone
from copy import copy
from TransformationNaturelle import TransfoNat
from typing import *
cat = GC(set("ABC"))
f,g = [MGC('A','B','f'),MGC('A','C','g')]
f,g = [MGC('A','B','f'),MGC('C','B','g')]
cat |= {f,g}
/!\ marche pas si les flèches ajoutées ajoute de nouveaux cocônes.
Faire une boucle while. /!\
def modification(gc: GC, option_ajout:Tuple[Sequence[Any],Sequence[Morphisme]] = (set(),set()), option_elimination:Sequence[Diagramme] = set(), option_complex_agissante:Sequence[Diagramme] = set()) -> Tuple[GC,Foncteur]:
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)
fonct = Foncteur(gc,nouveau_gc,{o:o for o in gc.objets},{m:m for m in gc[gc.objets,gc.objets]})
nouveaux_obj, nouvelles_fleches = option_ajout
nouveau_gc |= set(nouveaux_obj)
nouveau_gc |= set(nouvelles_fleches)
nouveau_gc -= set(option_elimination)
for diag in option_complex_agissante:
c_a = ChampActif(fonct@diag)
c_a.transformer_graphviz()
colimites = c_a.objets_colimites()
if len(colimites) == 0:
# S'il n'y avait pas de colimite, on la créé
nouvel_objet = str(diag)
while nouvel_objet in nouveau_gc.objets:
nouvel_objet += "'"
nouveau_gc |= {nouvel_objet}
dico_index_jambe = dict() # {i:jambe}
for i in diag.source.objets:
jambe = MGC(diag(i),nouvel_objet)
dico_index_jambe[i] = jambe
nouveau_gc |= {jambe}
for fleche_i in diag.source[diag.source.objets, diag.source.objets]:
if dico_index_jambe[fleche_i.source] != dico_index_jambe[fleche_i.cible]@diag(fleche_i):
MGC.identifier_morphismes(dico_index_jambe[fleche_i.cible]@diag(fleche_i),dico_index_jambe[fleche_i.source])
#ajouter les flèches vers les autres cocônes
for cocone in c_a.objets:
cocone = Cocone(cocone)
nouvelle_fleche = MGC(nouvel_objet,cocone.nadir)
while True:
for diag in option_complex_agissante:
c_a = ChampActif(fonct@diag)
colimites = c_a.objets_colimites()
if len(colimites) == 0:
# S'il n'y avait pas de colimite, on la créé
nouvel_objet = "Colimite de "+str(diag)
while nouvel_objet in nouveau_gc.objets:
nouvel_objet += "'"
nouveau_gc |= {nouvel_objet}
dico_index_jambe = dict() # {i:jambe}
for i in diag.source.objets:
jambe = MGC(diag(i),nouvel_objet)
dico_index_jambe[i] = jambe
nouveau_gc |= {jambe}
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])
if dico_index_jambe[fleche_i.source] != dico_index_jambe[fleche_i.cible]@diag(fleche_i):
MGC.identifier_morphismes(dico_index_jambe[fleche_i.cible]@diag(fleche_i),dico_index_jambe[fleche_i.source])
#ajouter les flèches vers les autres cocônes
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])
break
else:
for diag in option_complex_classifiante:
c_p = ChampPerceptif(fonct@diag)
limites = c_p.objets_limites()
if len(limites) == 0:
# S'il n'y avait pas de limite, on la créé
nouvel_objet = "Limite de "+str(diag)
while nouvel_objet in nouveau_gc.objets:
nouvel_objet += "'"
nouveau_gc |= {nouvel_objet}
dico_index_jambe = dict() # {i:jambe}
for i in diag.source.objets:
jambe = MGC(nouvel_objet,diag(i))
dico_index_jambe[i] = jambe
nouveau_gc |= {jambe}
for fleche_i in diag.source[diag.source.objets, diag.source.objets]:
if dico_index_jambe[fleche_i.cible] != diag(fleche_i)@dico_index_jambe[fleche_i.source]:
MGC.identifier_morphismes(diag(fleche_i)@dico_index_jambe[fleche_i.source],dico_index_jambe[fleche_i.cible])
#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))
break
else:
break # si on a rien ajouté on peut enfin sortir
return nouveau_gc,fonct
cat.transformer_graphviz()
h = MGC('S','T','h')
diag = DiagrammeIdentite(cat)
cat2,fonct = modification(cat,({'S','T'},{h}),{},{diag})
cat2,fonct = modification(cat,({'S','T'},{h}),{},{diag},{diag})
cat2.transformer_graphviz()
fonct.transformer_graphviz()
diag = fonct@diag
diag.transformer_graphviz()
ChampActif(diag).transformer_graphviz()
for cocone in ChampActif(diag).objets:
Cocone(cocone).transformer_graphviz()
ChampPerceptif(diag).transformer_graphviz()
for cone in ChampPerceptif(diag).objets:
Cone(cone).transformer_graphviz()
\ 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