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

Foncteur de catégories ordre total

parent 6dce02a6
......@@ -4,7 +4,7 @@ from Morphisme import Morphisme
import itertools
class CategorieAcyclique(CategorieQuotient):
"""`CategorieAcyclique` peut être abrégé en `CatAcyclique` ou en 'CatOrdre'.
"""`CategorieAcyclique` peut être abrégé en `CatAcyclique`.
Catégorie quotientée par la relation d'équivalence sur les objets suivante :
x ~ y ssi il existe f: x -> y et il existe g: y -> x."""
......@@ -45,8 +45,7 @@ class CategorieAcyclique(CategorieQuotient):
return tri
CatAcyclique = CategorieAcyclique
CatOrdre = CatAcyclique
CatAcyclique = CategorieAcyclique
def test_CategorieAcyclique():
from CategorieAleatoire import GrapheCompositionAleatoire
......
......@@ -6,7 +6,9 @@ from CategorieProduit import CategorieProduit
from CategorieLibre import CategorieLibre
from CategorieComposantesConnexes import CatCC
from CategorieAcyclique import CatAcyclique
from CategorieOrdre import CatOrdre
from CategorieFine import CatFine
from CategorieOrdreTotal import CatOrdreTotal
import random
import copy
import itertools
......@@ -386,6 +388,32 @@ def test_FoncteurAleatoireCatCC():
f.as_diagram().transformer_graphviz()
f.transformer_graphviz()
class FoncteurAleatoireCatOrdreTotal(Foncteur):
"""Foncteur aléatoire entre deux catégories ordres totaux."""
def __init__(self, categorie_indexante:CatOrdreTotal, categorie_cible:CatOrdreTotal, nom:Union[str,None] = None):
cat1,cat2 = categorie_indexante,categorie_cible
objets1,objets2 = list(categorie_indexante.tri_topologique()),list(categorie_cible.tri_topologique())
image = [random.randint(0,len(objets2)-1) for i in range(len(objets1))]
image.sort()
app_obj = {objets1[i]:objets2[image[i]] for i in range(len(objets1))}
app_morph = {m:next(cat2({app_obj[m.source]},{app_obj[m.cible]})) for m in cat1[cat1.objets,cat1.objets]}
Foncteur.__init__(self,categorie_indexante,categorie_cible,app_obj,app_morph)
def test_FoncteurAleatoireCatOrdreTotal():
import random
random.seed(4)
c1,c2 = GrapheCompositionAleatoire(20,150),GrapheCompositionAleatoire(20,150)
c1.transformer_graphviz()
c2.transformer_graphviz()
c1_,c2_ = CatOrdreTotal(c1),CatOrdreTotal(c2)
c1_.transformer_graphviz()
c2_.transformer_graphviz()
f = FoncteurAleatoireCatOrdreTotal(c1_,c2_)
f.transformer_graphviz()
f.as_diagram().transformer_graphviz()
class FoncteurAleatoireCatFineAcycliqueConnexe(Foncteur):
"""Foncteur aléatoire entre deux catégories fines acycliques et connexes."""
def __init__(self, categorie_indexante:Categorie, categorie_cible:Categorie, nom:Union[str,None] = None):
......@@ -595,4 +623,5 @@ if __name__ == '__main__':
# test_MonoideGC()
# test_FoncteurCCAleatoire()
# test_FoncteurCatAcycliqueAleatoire()
test_FoncteurAleatoireCatFineAcycliqueConnexe()
\ No newline at end of file
# test_FoncteurAleatoireCatFineAcycliqueConnexe()
test_FoncteurAleatoireCatOrdreTotal()
\ No newline at end of file
from Categorie import Categorie
from CategorieAcyclique import CatAcyclique
from CategorieQuotient import CategorieQuotient
from Morphisme import Morphisme
import itertools
class CategorieOrdre(CatAcyclique):
"""`CategorieOrdre` peut être abrégé en `CatOrdre`.
Catégorie acyclique telle qu'il ne peut pas y avoir plus d'une flèche entre deux objets."""
def __init__(self,categorie_a_quotienter:Categorie, nom:str = None):
if nom == None:
nom = "Catégorie ordre engendrée par "+str(categorie_a_quotienter)
CatAcyclique.__init__(self,categorie_a_quotienter,nom)
for obj1, obj2 in itertools.product(self.objets,repeat=2):
self.identifier_ensemble_morphismes(set(categorie_a_quotienter(obj1,obj2)))
CatOrdre = CategorieOrdre
def test_CategorieOrdre():
from CategorieAleatoire import GrapheCompositionAleatoire
import random
random.seed(1)
for i in range(1):
c = GrapheCompositionAleatoire(20,150)
c.transformer_graphviz()
c_a = CatOrdre(c)
c_a.transformer_graphviz()
c_a.fonct_surjection.transformer_graphviz()
for obj in c_a.objets:
c_a.sous_cat_equiv(obj).transformer_graphviz()
print(c_a.tri_topologique())
if __name__ == '__main__':
test_CategorieOrdre()
\ No newline at end of file
from Categorie import Categorie
from CategorieAcyclique import CatOrdre
from CategorieOrdre import CatOrdre
from CategorieQuotient import CategorieQuotient
import copy
import itertools
from typing import *
class CategorieOrdreTotal(CategorieQuotient):
class CategorieOrdreTotal(CatOrdre):
"""`CategorieOrdreTotal` peut être abrégé en `CatOrdreTotal`
Catégorie qui correspond à une relation d'ordre totale : catégorie acyclique telle que tous les éléments sont comparables (toutes les flèches sont composables).
On fait un tri topologique. En suivant le tri, les objets sont équivalents tant qu'il n'y a aucune flèche intraclasse.
"""
def __init__(self,categorie_a_quotienter:CatOrdre, nom:str = None):
def __init__(self,categorie_a_quotienter:Categorie, nom:str = None):
if nom == None:
nom = "Catégorie ordre total engendrée par "+str(categorie_a_quotienter)
CategorieQuotient.__init__(self,categorie_a_quotienter,nom)
tri = categorie_a_quotienter.tri_topologique()
CatOrdre.__init__(self,categorie_a_quotienter,nom)
tri = self.tri_topologique()
classe_equiv_en_cours = set()
for obj in tri:
if next(categorie_a_quotienter(classe_equiv_en_cours,{obj}),None) == None:
classe_equiv_en_cours |= {obj}
if next(categorie_a_quotienter(classe_equiv_en_cours,obj),None) == None:
classe_equiv_en_cours |= obj
else:
self.identifier_ensemble_morphismes(set(map(lambda x:categorie_a_quotienter.identite(x),classe_equiv_en_cours)))
classe_equiv_en_cours = {obj}
classe_equiv_en_cours = obj
self.identifier_ensemble_morphismes(set(map(lambda x:categorie_a_quotienter.identite(x),classe_equiv_en_cours)))
for classe1,classe2 in itertools.product(self.objets,repeat=2):
self.identifier_ensemble_morphismes(set(categorie_a_quotienter(classe1,classe2)))
......@@ -39,8 +39,7 @@ def test_CatOrdreTotal():
for i in range(10):
c = GrapheCompositionAleatoire()
c.transformer_graphviz()
c_o = CatOrdre(c)
c_ot = CatOrdreTotal(c_o)
c_ot = CatOrdreTotal(c)
c_ot.transformer_graphviz()
if __name__ == '__main__':
......
......@@ -87,7 +87,7 @@ class CategorieQuotient(CategorieLibre):
if self._morph_vers_classe[morph1] != self._morph_vers_classe[morph2]:
if morph2.source not in self._obj_vers_classe[morph1.source]:
# Il faut identifier les deux sources
obj_a_update = self._obj_vers_classe[morph1.source]|self._obj_vers_classe[morph2.source]
obj_a_update = ObjetQuotient(self._obj_vers_classe[morph1.source]|self._obj_vers_classe[morph2.source])
self -= {self._obj_vers_classe[morph1.source],self._obj_vers_classe[morph2.source]}
self |= {obj_a_update}
for obj in obj_a_update:
......@@ -103,8 +103,8 @@ class CategorieQuotient(CategorieLibre):
if len(m.cible-obj_a_update) == 0: #cible inclus dans les obj_a_update
self._morph_vers_classe[morph] = MorphismeQuotient(m.source,obj_a_update,m.classe_morphismes,self)
if morph2.cible not in self._obj_vers_classe[morph1.cible]:
# Il faut identifier les deux sources
obj_a_update = self._obj_vers_classe[morph1.cible]|self._obj_vers_classe[morph2.cible]
# Il faut identifier les deux cibles
obj_a_update = ObjetQuotient(self._obj_vers_classe[morph1.cible]|self._obj_vers_classe[morph2.cible])
self -= {self._obj_vers_classe[morph1.cible],self._obj_vers_classe[morph2.cible]}
self |= {obj_a_update}
for obj in obj_a_update:
......
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