Commit 14e01209 authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

construction progressive du foncteur aléatoire

parent 7210ba2b
......@@ -6,6 +6,7 @@ from CategorieProduit import CategorieProduit
from CategorieLibre import CategorieLibre
from CategorieComposantesConnexes import CatCC
from CategorieAcyclique import CatAcyclique
from CategorieFine import CategorieFine
import random
import copy
import itertools
......@@ -363,12 +364,12 @@ def test_MonoideGC():
mon.loi_de_composition_to_csv(destination="lois de composition/monoide.csv")
class FoncteurCCAleatoire(Foncteur):
class FoncteurAleatoireCatCC(Foncteur):
"""Foncteur aléatoire entre deux catégories composantes connexes."""
def __init__(self,categorie_indexante:CatCC, categorie_cible:CatCC, nom:Union[str,None] = None):
Foncteur.__init__(self,categorie_indexante,categorie_cible,{obj:random.choice(list(categorie_cible.objets)) for obj in categorie_indexante.objets},dict(),nom)
def test_FoncteurCCAleatoire():
def test_FoncteurAleatoireCatCC():
import random
random.seed(4)
......@@ -378,18 +379,73 @@ def test_FoncteurCCAleatoire():
cc1,cc2 = CatCC(c1),CatCC(c2)
cc1.transformer_graphviz()
cc2.transformer_graphviz()
f = FoncteurCCAleatoire(cc1,cc2)
f = FoncteurAleatoireCatCC(cc1,cc2)
f.as_diagram().transformer_graphviz()
f.transformer_graphviz()
f = FoncteurCCAleatoire(cc1,cc2)
f = FoncteurAleatoireCatCC(cc1,cc2)
f.as_diagram().transformer_graphviz()
f.transformer_graphviz()
class FoncteurCatAcycliquesAleatoire(Foncteur):
class FoncteurAleatoireCatFineAcycliqueConnexe(Foncteur):
"""Foncteur aléatoire entre deux catégories acycliques connexes."""
def test_FoncteurAleatoireCatFineAcycliqueConnexe():
import random
random.seed(4)
c1,c2 = GrapheCompositionAleatoire(),GrapheCompositionAleatoire()
c1.transformer_graphviz()
c2.transformer_graphviz()
f = FoncteurAleatoireCatFineAcycliqueConnexe(c1,c2)
class FoncteurAleatoireCatAcycliques(Foncteur):
"""Foncteur aléatoire entre deux catégories acycliques."""
def __init__(self,categorie_indexante:CatAcyclique, categorie_cible:CatAcyclique, nom:Union[str,None] = None):
fonct_cc = FoncteurAleatoire(categorie_indexante,categorie_cible)
Foncteur.__init__(self,categorie_indexante,categorie_cible,{obj:random.choice(list(categorie_cible.objets)) for obj in categorie_indexante.objets},dict(),nom)
ccc1,ccc2 = CatCC(categorie_indexante),CatCC(categorie_cible)
fonct_ccc = FoncteurAleatoireCatCC(ccc1,ccc2)
ccc1.transformer_graphviz()
ccc2.transformer_graphviz()
fonct_ccc.transformer_graphviz()
app_obj = dict()
app_morph = dict()
for cc in ccc1.objets:
cat_connexe1,cat_connexe2 = ccc1.sous_cat_equiv(cc),ccc2.sous_cat_equiv(fonct_ccc(cc))
cat1.transformer_graphviz()
cat2.transformer_graphviz()
morph = None
for f in cat1[cat1.objets,cat1.objets]:
if not f.is_identite:
morph = f
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(cat1.objets)[0]] = random.choice(list(cat2.objets))
else:
# on doit mapper le morphisme morph
fleches_deja_map = {morph}
fleches_cat2 = list(cat2(cat2.objets,cat2.objets))
app_morph[morph] = random.choice(fleches_cat2)
app_obj[morph.source] = app_morph[morph].source
while True:
for fleche_deja_map in fleches_deja_map:
for fleche in cat1[{fleche_deja_map.cible},cat1.objets]:
if fleche not in fleches_deja_map:
# notons g la flèche déjà mappée
# fleche doit être mappée à une flèche de source F(g).cible telle que si F(gof) est définie alors F(g)oF(f) = F(gof)
pass
# Foncteur.__init__(self,categorie_indexante,categorie_cible,{obj:random.choice(list(categorie_cible.objets)) for obj in categorie_indexante.objets},dict(),nom)
def test_FoncteurAleatoireCatAcycliques():
import random
random.seed(4)
c1,c2 = GrapheCompositionAleatoire(),GrapheCompositionAleatoire()
c1.transformer_graphviz()
c2.transformer_graphviz()
f = FoncteurAleatoireCatAcycliques(c1,c2)
class FoncteurAleatoire(Foncteur):
"""Foncteur aléatoire sur une catégorie."""
......@@ -484,4 +540,6 @@ def test_FoncteurAleatoire():
if __name__ == '__main__':
# test_GrapheCompositionAleatoire()
# test_MonoideGC()
test_FoncteurCCAleatoire()
\ No newline at end of file
# test_FoncteurCCAleatoire()
# test_FoncteurCatAcycliqueAleatoire()
test_FoncteurAleatoireCatFineAcycliqueConnexe()
\ No newline at end of file
from Categorie import Categorie
from Foncteur import Foncteur
from CategorieQuotient import CategorieQuotient
from Morphisme import Morphisme
import itertools
from typing import *
class CategorieFine(CategorieQuotient):
"""`CategorieFine` est similaire à `CategoriePreordre`, elle passe par une catégorie quotient contrairement à cette dernière.
Catégorie quotientée par la relation d'équivalence sur les morphismes suivante :
f : A->B ~ g : C->D ssi A = C et B = D"""
def __init__(self,categorie_a_quotienter:Categorie, nom:str = None):
if nom == None:
nom = "Catégorie fine engendrée par "+str(categorie_a_quotienter)
CategorieQuotient.__init__(self,categorie_a_quotienter,nom)
for obj1, obj2 in itertools.product(categorie_a_quotienter.objets,repeat=2):
morphismes = list(categorie_a_quotienter({obj1},{obj2}))
for morph in morphismes[1:]:
self.identifier_morphismes(morph,morphismes[0])
def test_CategorieFine():
from CategorieAleatoire import GrapheCompositionAleatoire
import random
random.seed(3)
for i in range(3):
c = GrapheCompositionAleatoire()
c.transformer_graphviz()
c_a = CategorieFine(c)
c_a.transformer_graphviz()
c_a.fonct_surjection.transformer_graphviz()
if __name__ == '__main__':
test_CategorieFine()
\ 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