Commit 48dfbd16 authored by Guillaume Sabbagh's avatar Guillaume Sabbagh
Browse files

abandon CatOrdreTotal

parent db40c63d
from Categorie import Categorie
from CategorieAcyclique import CatOrdre
from CategorieQuotient import CategorieQuotient
import copy
import itertools
from typing import *
class CategorieQuasiOrdreTotal(CategorieQuotient):
"""`CategorieQuasiOrdreTotal` peut être abrégé en `CatQuasiOrdreTotal`
Catégorie qui correspond à une quasi-relation d'ordre totale : catégorie acyclique telle que tous les éléments sont comparables (toutes les flèches sont composables).
/!\ il peut cependant y avoir plusieurs flèches entre deux objets contrairement à `CategorieOrdreTotal`/!\
Catégorie quotientée par la relation d'équivalence sur les objets suivante :
Les objets sans père sont équivalents.
Les enfants de ces objets sont équivalents (les enfants de A sont des objets B tel qu'il existe une flèche de A vers B mais il n'existe aucune flèche d'un C vers B tel qu'il existe une flèche de A vers C).
Les enfants des enfants de ces objets sont équivalents.
etc.
"""
def __init__(self,categorie_a_quotienter:CatOrdre, nom:str = None):
if nom == None:
nom = "Catégorie quasi-ordre total engendrée par "+str(categorie_a_quotienter)
CategorieQuotient.__init__(self,categorie_a_quotienter,nom)
cat = categorie_a_quotienter # on a besoin que d'une flèche entre deux objets
noeuds_courants = {obj for obj in cat.objets if all(map(lambda x:x.is_identite,cat[cat.objets,{obj}]))} # les objets sans père n'ont que l'identité comme flèche entrante
self.identifier_ensemble_morphismes(set(map(lambda x:cat.identite(x),noeuds_courants))) # on identifie les identités des objets de départ
while len(noeuds_courants) > 0:
fleches_descendantes = {f for f in cat(noeuds_courants,cat.objets) if not f.is_identite}
print(fleches_descendantes)
fils_associes = set(map(lambda x:x.cible,fleches_descendantes))
vrais_fils = copy.copy(fils_associes)
for fils in fils_associes:
vrais_fils -= {f.cible for f in cat({fils},cat.objets) if not f.is_identite}
fleches_courantes = set(cat(noeuds_courants,vrais_fils))
self.identifier_ensemble_morphismes(set(map(lambda x:cat.identite(x.cible),fleches_courantes))) # on identifie les identités des cibles des flèches courantes
self.identifier_ensemble_morphismes(fleches_courantes) # on identifie les identités des cibles des flèches courantes
noeuds_courants = vrais_fils
CatQuasiOrdreTotal = CategorieQuasiOrdreTotal
def test_CatQuasiOrdreTotal():
from CategorieAleatoire import GrapheCompositionAleatoire
import random
random.seed(3)
for i in range(10):
c = GrapheCompositionAleatoire()
c.transformer_graphviz()
c_o = CatOrdre(c)
c_o.transformer_graphviz()
c_ot = CatQuasiOrdreTotal(c_o)
c_ot.transformer_graphviz()
class CategorieOrdreTotal(CategorieQuotient):
"""`CategorieOrdreTotal` peut être abrégé en `CatOrdreTotal`
Catégorie qui correspond à une quasi-relation d'ordre totale : catégorie acyclique telle que tous les éléments sont comparables (toutes les flèches sont composables).
/!\ il peut cependant y avoir plusieurs flèches entre deux objets contrairement à `CategorieOrdreTotal`/!\
Catégorie quotientée par la relation d'équivalence sur les objets suivante :
Les objets sans père sont équivalents.
Les enfants de ces objets sont équivalents (les enfants de A sont des objets B tel qu'il existe une flèche de A vers B mais il n'existe aucune flèche d'un C vers B tel qu'il existe une flèche de A vers C).
Les enfants des enfants de ces objets sont équivalents.
etc.
"""
def __init__(self,categorie_a_quotienter:CatQuasiOrdreTotal, 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)
# simples contraintes de catégorie fine
for obj1, obj2 in itertools.product(categorie_a_quotienter.objets,repeat=2):
self.identifier_ensemble_morphismes(set(categorie_a_quotienter({obj1},{obj2})))
CatOrdreTotal = CategorieOrdreTotal
def test_CatOrdreTotal():
from CategorieAleatoire import GrapheCompositionAleatoire
import random
random.seed(3)
for i in range(10):
c = GrapheCompositionAleatoire()
c_o = CatOrdre(c)
c_qot = CategorieQuasiOrdreTotal(c_o)
c_ot = CatOrdreTotal(c_qot)
c_ot.transformer_graphviz()
if __name__ == '__main__':
test_CatQuasiOrdreTotal()
test_CatOrdreTotal()
\ 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